如果要求就这么简单,那么您只需使用 bash 替换即可:
for file in `find . -name 'pippo*.txt'`; do
mv $file ${file/[0-9].txt/.txt}
done
但是,这将在文件名中的多个单个数字上失败,例如pippo999/pippo999.txt
. 这可以通过设置extglob
选项来解决:
shopt -s extglob
for file in `find . -name 'pippo*.txt'`; do
mv $file ${file/+([0-9]).txt/.txt}
done
bash 文件 globbing 中的+(...)
构造仅在extglob
设置时可用。
不是使用循环遍历目录树 and cd
,而是find
用于获取所有相关文件的列表,然后循环遍历该文件名列表,其形式为:./pippoN/pippoN.txt
. 重命名使用 bash参数替换来获取修改后的文件名。另请参见文件名扩展。
请注意,文件或目录名称中的空格会破坏这种方法,首先使用find
: 包含空格的路径将被拆分为围绕空格的多个标记,每个标记是列表迭代器中的单独结果。因此,如果您需要预测路径中的空格字符,那么这会变得有点复杂:
shopt -s extglob
IFS=$'\n'
for file in `find . -name 'pippo*.txt'`; do
mv "$file" "${file/+([0-9]).txt/.txt}"
done
在这里,我们引用了mv
命令的文件名,它将正确处理空格,并且我们更改了字段分隔符IFS
,以便 bash 不会将空格识别为单词边界。这将解决find
循环迭代器中的问题。现在路径中的空格将被正确处理,因此 eg./pippo 9/pippo9.txt
也将被重命名为:./pippo 9/pippo.txt
。