如何重命名unix中所有子目录中的某些文件?
How to rename certain files in all subdirectories in unix?
我将主目录作为主题,在其中我有子目录和子子目录。子目录如 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 {} \;
但这不起作用。我该如何解决?请帮忙!
您的 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
并尝试一下。当你看到你喜欢的结果时,把它改回来。
我将主目录作为主题,在其中我有子目录和子子目录。子目录如 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 {} \;
但这不起作用。我该如何解决?请帮忙!
您的 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
并尝试一下。当你看到你喜欢的结果时,把它改回来。