【问题标题】:Rename multiple files in bash在bash中重命名多个文件
【发布时间】:2013-03-01 02:04:13
【问题描述】:

我在某个目录中有A.jsB.jsC.js,我想在 bash shell 中编写一个命令行来重命名这些文件 _A、_B、_C。我该怎么做?

我尝试了find -name '*.sh' | xargs -I file mv file basename file .sh,但它不起作用,basename 文件 .sh 未被识别为嵌套命令

【问题讨论】:

  • 我试过 find -name '*.sh' | xargs -I file mv file basename file .sh 但它不起作用,basename file .sh 不被识别为嵌套命令
  • 欢迎来到stackoverflow。请阅读常见问题解答和whathaveyoutried.com,然后编辑您的问题。
  • 我看过那篇文章,你说得对,文章的作者也说得对。但是如果你必须解决 10 个问题并且其中一个问题的解决方案会产生一个新问题(在我的情况下重命名此文件)并且你的时间很少(因为你的老板正在等待所有 10 个问题的解决方案)将您是直接要求解决方案还是要求在没有精确解决方案的情况下解决问题的方法?后者也许更好,但如果你的时间很少呢?我认为有时只要求解决方案是必要的。问候并感谢您向我指出这个问题。

标签: linux bash shell


【解决方案1】:

使用目录遍历的简单原生方式:

find -type f | xargs -I {} mv {} {}.txt

将重命名每个文件,在末尾添加扩展名 .txt。

并行化还有一个更通用的酷方法:

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}change_between${f:8}'

【讨论】:

    【解决方案2】:

    怎么样

    rename 's/(.*).js/_$1/' *.js
    

    检查系统上重命名的语法。

    上面的命令会将A.js重命名为_A等等。

    如果您想保留扩展名,以下内容应该会有所帮助:

    rename 's/(.*)/_$1/' *.js
    

    【讨论】:

    • +1 因为重命名是个好工具。仅供参考,它是用 Perl 编写的,因此跨系统的语法是统一的 search.cpan.org/~rmbarker/File-Rename-0.06/rename.PL
    • @msw:不,语法可能不同。我见过语法 - 'rename "from_regex" "to_string" files_filter' 而不是 rename 's/from_regex/to_string/' files_filter
    【解决方案3】:

    假设您仍想保留文件的扩展名,您可以这样做:

    $ for f in * ; do mv "$f" _"$f" ; done
    

    它将获取目录中每个文件的名称,并在前面加上一个“_”。

    【讨论】:

    • 如果我理解他的话,他也想删除文件扩展名。
    • 非常感谢!我这样修改了代码: for f in * ;做 mv "$f" "_$(basename $f .sh)" ;完成了,效果很好!
    • @user1703524 太好了!实际上,我正要以与您刚刚所做的几乎非常相似的方式来编辑帖子。很高兴它正在工作。
    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 2014-01-06
    • 2012-05-01
    • 2020-02-18
    • 2012-12-31
    • 2016-08-03
    • 2012-02-12
    • 2011-01-25
    相关资源
    最近更新 更多