我的任务是编写一个脚本,在给定目录中搜索没有.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
。如何改进?
答案 0 :(得分:1)
你可以像这样使用单行:
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
表示的返回文件执行{}
(move)命令,并使用{}.old
添加一个扩展名,这意味着什么 - 文件名已被返回.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
文件是否通过了这些测试条件。我用您提供的样本测试了它,这将返回所需的结果。