如何重命名unix中所有子目录中的某些文件?

How to rename certain files in all subdirectories in unix?

我将主目录作为主题,在其中我有子目录和子子目录。子目录如 Beta_0.001、Beta_0.002Beta_0.005Beta_0.01.

每个子目录都有子目录,如Iter_100Iter_500Iter_1000

我有四个包含特殊符号的文件名。例如:

Aviva_buys_US_insurer_for_?1.6bn.txt

我想将此文件重命名为 Aviva_buys_US_insurer_for_1.6bn.txt。类似地,其他带有特殊符号的文件通过删除特殊符号。

我尝试使用:

find . -type f -exec mv Aviva_buys_US_insurer_for_?1.6bn.txt Aviva_buys_US_insurer_for_1.6bn.txt {} \; 

但这不起作用。我该如何解决?请帮忙!

您的 find 命令没有执行任何操作,因为 mv 命令包含静态文件名。你想要一些东西来找到带有有趣字符的文件(如果没有更多信息我们真的不知道 究竟 你所说的 "funny" 是什么意思)然后运行 ​​mv每个找到的文件名。

我想不出一个简单的方法来生成没有有趣字符的文件名而不产生子 shell,所以让我们简单地将所有找到的文件传递给一个子 shell,它执行一个循环并生成新名称。

我的 "funny" 表达式包含一组相当有限的 "unfunny" 个字符,并将其他所有字符视为 "funny"。你可能想用更多的字符来扩展它(也许你想保留 : and/or ! and/or + 等等;尽管确保你保留 - 作为 ! 否定运算符后的第一个字符)。

funny='[!-A-Za-z0-9_./]'
export funny  # Make this variable visible in the subshell we spawn, too
find . -type f -name "*$funny*" -exec bash -c 'for f; do
    mv "${f}" "${f//$funny/}"; done' _ {} \+

这使用 Bash 字符串插值 ${variable//from/to} 替换所有出现的 "funny" 字符;和 find -exec \+ 将尽可能多的找到的文件传递给单个子 shell。如果你的 find 不支持这个,你将需要重构。

这并不完全可靠——如果文件名仅由 "funny" 个字符组成,替换将产生一个空文件名,这是不允许的(尽管如果路径有效,它将被移动到自身上,这样是无害的)。

如果您想进行试验,请将 mv 更改为 echo mv 并尝试一下。当你看到你喜欢的结果时,把它改回来。