在bash中重命名具有动态名称的文件

时间:2014-01-29 22:25:08

标签: bash file rename mv

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

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

name='search'
Name='Search'

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

4 个答案:

答案 0 :(得分:3)

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

name='search'
export Name='Search'

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

答案 1 :(得分:2)

\您可以转义引号,无需导出:

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

答案 2 :(得分:1)

您可以使用find查找要重命名的文件列表,并将其传递给另一个程序进行重命名。

例如,你可以这样做:

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

(如果您使用的是多核计算机,那么使用Gnu parallel代替xargs可以通过此方法进一步提升性能

答案 3 :(得分:0)

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

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