想把一个目录下的所有文件的名称里的某个字符给删掉,刚写好一个功能实验了下,指定了目录,结果没想到脚本去操作指定目录以外的其它目录了,都不知道为什么,还好没用 root,要不后果不堪设想,到现在也不知道原因何在
我指定了的目录是 /home/mh/Document/test,结果还把 /home/mh/下其它目录也扫了一遍,但不知道有没有文件被修改,估计是有了,我用的字符是"es",应该比较常见,求大大帮我看看,顺便问问有没有办法反向来一套复原的操作
这是脚本
#!/bin/bash PWD=$(pwd) # 校正输入 invalid_input () { printf "\e[41m\e[30mInvalid input '$REPLY'\e[0m\n" >&2 exit 1 } # 删除字符串并重命名 delWord () { echo del for i in $(ls);do if [ -f $PWD/$i ];then rename $str '' $(pwd)/$i echo "good job" elif [ -d $PWD/$i ];then (cd $PWD/$i;delWord) fi done printf "\e[42m\e[30mDone!\e[0m\n" } # 添加字符串并重命名 addWord () { echo add } # 输入文件所在目录 read -p "Enter a path: " workpath if [[ ! -d $workpath ]];then printf "\e[42m\e[31mError: Enter a valid path, try again.\e[0m\n" exit 2 fi # 输入添加 /删除的字符串 read -p "Enter a String > " str # str 中是否含有非法字符 if [[ $str =~ [^_-.[:alnum:]] ]] || [[ $str =~ ^[[:digit:]] ]];then invalid_input fi # 选择添加 /删除操作 read -p "Delete or add a string?(1.del 2.add): " if [[ $REPLY -eq 1 ]];then set -x cd $wordpath delWord $str set +x elif [[ $REPLY -eq 2 ]];then addWord else invalid_input fi
这是部分输出结果,太多了只贴一部分,前面有好多终端拉不上去了看不到,也不知道处理了目标目录后它怎么干的,应该重定向到文本里的,唉!
...... + cd linux + delWord + echo del del ++ ls + for i in $(ls) + '[' -f /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86 ']' + '[' -d /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86 ']' + cd x86 + delWord + echo del del ++ ls + for i in $(ls) + '[' -f /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86/libpty.so ']' + rename es '' /home/mh/Public/pycharm-2017.3.3/lib/libpty/linux/x86/libpty.so + echo 'good job' good job + printf '\e[42m\e[30mDone!\e[0m\n' Done! ....
![]() | 1 plko345 OP 对了,写的兴起,所以加了点不必要的功能,不要在意 |
![]() | 2 est 2018-04-20 17:09:47 +08:00 chmod -R 000 / |
3 lmqdlr 2018-04-20 17:26:38 +08:00 via Android 想起来当年 bumblebee 的事故了 |
5 crazyvv 2018-04-20 17:31:43 +08:00 请问您是在哪个目录执行的这个脚本? |
![]() | 7 plko345 OP @crazyvv 我的目标目录是 /home/mh/Document/test 目录,我运行脚本的目录在 /home/mh/Document 目录 |
10 yrom 2018-04-20 18:06:41 +08:00 你的一个变量拼错了 cd $wordpath delWord $str 应该是 $workpath (_) |
![]() | 11 plko345 OP @yrom 我 X,还真是,谢谢,可是为什么会从家目录开始呢,而不是当前运行脚本的目录,我明明是在 Document 目录下运行的啊 |
![]() | 12 momocraft 2018-04-20 18:12:14 +08:00 有点辣眼睛 没看完 几个小建议: - set -ue - 加一个 dryrun 模式 - read 有不少坑,不如从命令行参数传进来 |
13 Azumo 2018-04-20 18:19:59 +08:00 想起刚玩 Linux 时在根目录迭代 sudo rm -rf / |
![]() | 14 mentalkiller 2018-04-20 18:30:55 +08:00 ```shell alias rm=trash trash(){ t=$(date +%Y%m%d%H%M%S) mv $@ /path/to/.trash/$@_$t } ``` |
![]() | 15 plko345 OP @momocraft set -e 我是想基本完成后再加的,read 的只是一时兴起加上去玩玩的,本来就函数里边的功能就完成了,无聊多写了些 |
17 menghuan 2018-04-20 18:34:24 +08:00 出过类似事故 rm 时候变量未定义就从家目录开始删 |
![]() | 21 doubleflower 2018-04-20 19:16:36 +08:00 写脚本 -e 一定要啊,不然中间操作错了会一路错下去,发生什么事都可能 |
22 afpro 2018-04-21 11:10:59 +08:00 PWD 会随着目录变化而变化的 运行一半就已经不是你开始的 PWD=$(pwd)了吧。。。。。。 |
24 szlszl35622 2018-04-21 20:18:34 +08:00 我一般都是在腾讯云的学生鸡上面测试脚本,, 出错直接重装系统 |