8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Unix 中根据模式重命名多个文件

Dpedrinha 2月前

135 0

目录中有多个以前缀 fgh 开头的文件,例如:fghfileafghfilebfghfilec 我想将它们全部重命名为以前缀 jkl 开头。有没有一个命令可以执行此操作...

目录中有多个以前缀 开头的文件 fgh ,例如:

fghfilea
fghfileb
fghfilec

我想将它们全部重命名为以前缀开头 jkl 。是否有单个命令可以执行此操作,而不是单独重命名每个文件?

帖子版权声明 1、本帖标题:在 Unix 中根据模式重命名多个文件
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Dpedrinha在本站《bash》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 有几种方法,但使用 rename 可能是最简单的。

    使用一个版本的 rename Perl's rename ):

    rename 's/^fgh/jkl/' fgh*
    

    使用另一个版本的 rename Judy2K 的答案 相同 ):

    rename fgh jkl fgh*
    

    您应该检查您所用平台的手册页来了解上述哪些内容适用。

  • +1甚至不知道重命名...现在我可以停止使用带有mv和sed的for循环...谢谢!

  • 您正在链接到不同的重命名,然后显示 unixhelp.ed.ac.uk/CGI/man-cgi?rename 的语法是另一个

  • aska 2月前 0 只看Ta
    引用 5

    并非所有 *nix 系统都存在。例如,Max OS X 上没有,而且 fink 中也没有包可以获取它。还没有查看过 MacPorts。

  • 据我所知,重命名似乎是 Linux 特有的脚本或实用程序。如果您关心可移植性,请继续使用 sed 和循环或内联 Perl 脚本。

  • 这是如何 sed mv 一起使用来重命名的方法:

    for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done
    

    根据以下评论,如果文件名中包含空格,则可能需要用引号 括住 返回要将文件移动到的名称的子函数:

    for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
    
  • 非常接近。请注意,您只想匹配第一次出现的 fgh:'s/^fgh/jkl/g'(插入符号使一切变得不同)。

  • 只是为了精确起见......您的意思是\'名称开头的 fgh\',而不是\'第一次出现 fgh\'。/^fgh/ 将匹配 \'fghi\',但不匹配 \'efgh\'。

  • 如果您无法访问 \'rename\',此方法非常有用。如果您的文件名包含空格,则代码可能需要引号。for f in fgh*; do mv \'$f\' \'$(echo $f | sed 's/^fgh/jkl/g')\'; done

  • @nik 如果不加引号,则重命名此文件列表将引发错误:touch fghfilea fghfileb fghfilec fghfile\ d。我建议您考虑@DaveNelson 的评论。

  • 重命名可能不在每个系统中。所以如果你没有它,请使用 bash shell 中的 shellthis 示例

    for f in fgh*; do mv "$f" "${f/fgh/xxx}";done
    
  • 也许更强调地指出这是一个 Bash 扩展,它在 POSIX sh 或其他 shell 中不存在。

  • 使用 mmv :

    mmv "fgh*" "jkl#1"
    
  • 如果您想要以递归方式批量重命名,请将 ; 与 #1 结合使用。例如:mmv \';fgh*\' \'#1jkl#2\'

  • 正是我需要的。使用 '' 捕获组并使用 #1、#2 等调用它们。例如:mmv \'my show ep 1080p.*\' \'my.show.#1.#2\' = my.show.001.avi

  • 有很多方法可以做到这一点(并非所有方法都能在所有 unixy 系统上起作用):

    • ls | cut -c4- | xargs -I§ mv fgh§ jkl§

      p1

    • for f in fgh*; do mv \'$f\' \'${f/fgh/jkl}\';done

      p2

    • rename 's/^fgh/jkl/' fgh*

      p3

    • rename fgh jkl fgh*

    • ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';

      p4

    其中一些有点复杂,并且列表远未完整,但您会在这里找到几乎所有 unix 系统所需的内容。

  • 在我的计算机上,这会产生错误“在 (eval 1) 第 1 行使用 \'strict subs\' 时不允许使用 Bareword \'fgh\'。”

  • 使用 find , xargs sed

    find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'
    

    它比 @nik 的解决方案 ,但它允许递归重命名文件。例如,结构,

    .
     fghdir
        fdhfilea
        fghfilea
     fghfile\ e
     fghfilea
     fghfileb
     fghfilec
     other
         fghfile\ e
         fghfilea
         fghfileb
         fghfilec
    

    将会变成这样,

    .
     fghdir
        fdhfilea
        jklfilea
     jklfile\ e
     jklfilea
     jklfileb
     jklfilec
     other
         jklfile\ e
         jklfilea
         jklfileb
         jklfilec
    

    使其工作的关键 xargs 从 xargs 调用 shell .

  • 这个答案允许的递归使它非常强大 - 我只是快速重命名了深度嵌套层次结构中的数千个文件。

返回
作者最近主题: