我将主目录作为主题,并且我有子目录和子子目录。子目录类似于Beta_0.00
1,Beta_0.002
,Beta_0.005
和Beta_0.01
。
每个子目录都有子目录,如Iter_100
,Iter_500
,Iter_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 {} \;
但这不起作用。我该如何解决?请帮忙!
答案 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
并进行游戏。当您看到自己喜欢的结果时,请将其更改回来。