【问题标题】:Rename files with dynamic name in bash在bash中用动态名称重命名文件
【发布时间】:2014-02-22 00:25:26
【问题描述】:

我正在尝试用动态名称重命名所有包含“名称”的文件。

所以这个文件“NameSomething”应该看起来像这个“SearchSomething”。但下面的脚本只是从文件名中删除“名称”。

name='search'
Name='Search'

find ../../$name-module -name 'Name*' -type f -exec bash -c 'mv "$1" "${1/Name/$Name}"' -- {} \;

【问题讨论】:

  • 也许$Name 不会传播到exec'd bash shell...也许你可以在find 之前构建命令字符串然后exec 它?
  • 您的$Name 在单引号内;除非它是环境变量 (export'd),否则它不会被扩展。

标签: bash file rename mv


【解决方案1】:

您可以使用 find 查找要重命名的文件列表,并将其通过管道传输到另一个程序以进行重命名。

例如,你可以这样做:

find ../../$name-module -print0 -name 'Name*' -type f | \
xargs -0 rename "s/Name/$Name/" 
  • 不需要导出(丑+可能会影响其他命令)
  • 重命名可能只运行一次(如果找到的所有文件都适合一个命令行)(使用-exec,您正在运行两个程序——bashmv——每个文件。这可能效率低下。

(如果您使用的是多核计算机,则可以通过使用 Gnu parallel 而不是 xargs 来进一步提高性能)

【讨论】:

    【解决方案2】:

    \可以转义引号,不需要导出:

    find ../../$name-module -name 'Name*' -type f -exec bash -c "mv \"\$1\" \"\${1/Name/$Name}\"" -- {} \;
    

    【讨论】:

    • 不幸的是,这不起作用(在我的情况下)。我在 bash 脚本中运行它并且已经有 $1 变量作为参数,所以它试图在这个参数中移动字符串而不是搜索的文件名。
    【解决方案3】:

    您必须导出名称,否则命令 find 不会将变量 $Name 继承到其环境中。所以:

    name='search'
    export Name='Search'
    
    find ../../$name-module -name 'Name*' -type f -exec bash -c 'mv "$1" "${1/Name/$Name}"' -- {} \;
    

    【讨论】:

    • @Tom:你应该接受我的回答。如果 find 提供了一个全功能的方式来继承和使用变量,那为什么要回归到 \"' caligraphy :)
    • 因为它比导出你知道的变量更清晰的解决方案 :) 如果可以的话,我会接受这两个答案。其他人认为,我应该接受这个答案吗?
    【解决方案4】:

    您可以使用基于 Perl 的 rename 命令:

    Name=Search
    rename "s/^Name/$Name/" *
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 2020-02-18
      • 2020-08-29
      • 2019-09-02
      • 2012-12-31
      • 1970-01-01
      • 2021-06-05
      • 2013-10-06
      相关资源
      最近更新 更多