重命名在for循环中按扩展名找到的所有文件



我的任务是编写一个脚本,搜索给定目录中所有没有.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文件是否通过了这些测试条件。我用您提供的样本进行了测试,结果符合要求。

最新更新