【问题标题】:Rename all files found by extension in for loop重命名for循环中通过扩展名找到的所有文件
【发布时间】:2016-07-23 11:30:36
【问题描述】:

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

如何改进?

【问题讨论】:

    标签: file unix grep rename ls


    【解决方案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 文件是否通过了这些测试条件。我用您提供的样本对其进行了测试,这会返回所需的结果。

    【讨论】:

    • 谢谢。您的解决方案完美运行。我使用您的脚本进行了一次更改,替换为 . 1美元。
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多