【问题标题】:Adding a prefix to the file names in Unix在 Unix 中为文件名添加前缀
【发布时间】:2015-09-10 09:18:47
【问题描述】:

如何重命名其他目录中的文件? 例如。在/home/abc/xyz/folder 目录下,我们有abc.csvxyz.csvpqr.csv 之类的文件,我们需要为这些文件添加前缀PREFIX_

我试过ls *.csv | xargs -I {} mv {} PREFIX_{}。这适用于当前目录,即/home/abc/xyz/folder

如何重命名 /home 目录中的那些?同样,我尝试了ls /home/abc/xyz/folder/*.csv | xargs -I {} mv {} PREFIX_{} — 不起作用。

【问题讨论】:

    标签: bash unix file-rename


    【解决方案1】:

    有一个工具,名为rename ;)

    $ touch {a..z}
    $ rename 's/^/xx_/' *
    $ ls
    xx_a  xx_b  xx_c  xx_d  xx_e  xx_f  xx_g  xx_h  xx_i  xx_j  xx_k  xx_l  xx_m  xx_n  xx_o  xx_p  xx_q  xx_r  xx_s  xx_t  xx_u  xx_v  xx_w  xx_x  xx_y  xx_z
    

    你可以把它和 find/xargs 结合起来(我刚刚玩了一下)

    find . -type f | xargs rename 's@(.*)/([^/]+)@$1/prefix_$2@'
    

    或者您可以使用 -exec,但在这种情况下,将为每个匹配查找条件的文件启动 1 个重命名过程

    find . -type f -exec rename 's@(.*)/([^/]+)@$1/prefix_$2@' "{}" \;
    

    注意:在我的系统上find | xargs 使用61ms 运行,但find -exec 使用1250ms(通过查找~52 匹配的文件)

    注意:我一直教导说只有一个重命名实用程序,它甚至还支持替代方案...我使用了来自perl 包的那个,也被命名为@987654331 @

    【讨论】:

    • 最好使用find-exec 功能而不是xargs
    • @AndreaCorbellini:但是,在这种情况下,将为每个匹配的文件启动一个单独的进程,我通常不希望这样,但我添加了一个 -exec 变体;)
    • @Zoltan Nagy:这行得通吗?如果我运行上面的代码来仅重命名一个目录中存在的那些文件,因为我在这里找不到任何指定的路径,请帮助解决这个问题,正如我在问题中所说的,我将从 /home 目录执​​行命令以重命名所有 .csv /home/abc/xyz/文件夹中的文件
    • 多个工具名为rename,它们采用不同的参数。
    • @bastian 我更新了答案;我正在使用prename;您可能希望通过以下方式检查您当前的默认替代方案:update-alternatives --query rename
    【解决方案2】:

    试试这个:

    ls *.csv| awk '{print "mv /home/abc/xyz/folder/" $0 " /home/abc/xyz/folder/PREFIX_"$0}'|sh
    

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2021-05-14
      相关资源
      最近更新 更多