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

时间:2016-04-04 02:59:28

标签: file unix grep rename ls

我的任务是编写一个脚本,在给定目录中搜​​索没有.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

如何改进?

1 个答案:

答案 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

说明:

您可以像这样修改脚本以获得类似的结果:

<强> 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文件是否通过了这些测试条件。我用您提供的样本测试了它,这将返回所需的结果。