2016-01-13 56 views
0

我有主目录作为主题,并在其中我有子目录和子子目录。子目录类似于Beta_0.00 1,Beta_0.002,Beta_0.005Beta_0.01如何重命名unix中所有子目录中的某些文件?

每个子目录都有子目录,如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 {} \; 

但是,这是行不通的。我该如何解决?请帮忙!

回答

3

由于mv命令包含一个静态文件名,因此您的find命令无效。你想要一些东西,发现有一些奇怪的字符文件(其中我们真的不知道没有更多的信息是什么究竟你所说的“滑稽”的意思),然后运行在每个找到的文件名mv

我想不到一个简单的方法来生成没有产生子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' _ {} \+ 

它使用猛砸串插${variable//from/to}替代的“滑稽”字符所有出现;和find -exec \+将尽可能多的找到的文件传递给一个子shell。如果你的find不支持这个,你将需要重构。

这不完全是强大的 - 如果文件名仅由“搞笑”的字符,替代会产生一个空文件名,这是不允许的(不过,如果路径是有效的,它会被移动到本身,这是无害的,因此)。

如果您想要进行实验,请将mv更改为echo mv并进行操作。当你看到你喜欢的结果时,将其改回。

相关问题