我的任务是编写一个脚本,搜索给定目录中所有没有.old
扩展名的文件,并将文件重命名为以下格式:filename.old
。我试过这个脚本:
#!/bin/bash
for i in $(grep ".[^old]&" $1 | ls)
do
mv "$1/$i" "$1/$i.old"
done
但它给出了错误的输出。
- 这些文件在我的目录中:
f1, f2.old, f3, f4.old
- 预期输出:
f1.old, f2.old, f3.old, f4.old
- 我的输出(第一次发布):
f1.old, f2.old.old, f3.old, f4.old.old
。每次我启动脚本时,它都会不断添加.old
扩展,所以它变成这样: - 我的输出(第二次发布):
f1.old.old, f2.old.old.old, f3.old.old, f4.old.old.old
如何改进?
您可以使用这样的一行代码:
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old ;
GNU/Linux(Ubuntu 14.04 LTS)示例:
mkdir so
cd so
touch f1 f2.old f3 f4.old
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old ;
ls
结果:
f1.old f2.old f3.old f4.old
说明:
find .
表示在当前目录中查找-mindepth 1
将返回文件而不返回当前目录.
(请参阅https://askubuntu.com/questions/153770/how-to-have-find-not-return-the-current-directory)! -name '*.old'
将跳过任何以.old
结尾的文件-exec mv
对用{}
表示的返回文件执行mv
(移动)命令,并为其添加扩展名{}.old
,意思是whatever-filename-was-returned.old
你可以这样修改你的脚本以获得类似的结果:
test.sh.old
#!/bin/bash
for i in $(find . -mindepth 1 ! -name '*.old'); do
mv "$i" "$i.old"
done
使用bash test.sh.old
执行以获得类似的结果。
您可能需要尝试一些测试用例,看看一行代码和修改后的test.sh.old
文件是否通过了这些测试条件。我用您提供的样本进行了测试,结果符合要求。