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

时间:2016-01-13 06:39:30

标签: bash unix file-rename

我将主目录作为主题,并且我有子目录和子子目录。子目录类似于Beta_0.00 1,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 {} \; 

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

1 个答案:

答案 0 :(得分:3)

您的find命令无效,因为mv命令包含静态文件名。你想要一些能找到带有趣字符的文件的东西(如果没有更多的信息我们真的不知道 你的意思是什么“搞笑”)然后在每个找到的文件上运行mv名。

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

我的“搞笑”表达包含一组相当有限的“不羁”字符,并认为其他一切都是“有趣”。您可能希望使用更多字符扩展它(可能您希望保留:和/或!和/或+等等;但请务必保留-作为!否定运算符之后的第一个字符。

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}来替换所有出现的“有趣”字符;和find -exec \+将尽可能多的找到的文件传递给单个子shell。如果您的find不支持此功能,则需要重构。

这不完全健壮 - 如果文件名只包含“有趣”字符,则替换将产生一个空文件名,这是不允许的(尽管如果路径有效,它将被移动到自身,这是无害的,如此)。

如果您想进行试验,请将mv更改为echo mv并进行游戏。当您看到自己喜欢的结果时,请将其更改回来。