如果要求只是这么简单,那么你可以只用bash的替代做到这一点:
for file in `find . -name 'pippo*.txt'`; do
mv $file ${file/[0-9].txt/.txt}
done
然而,这将在文件名上,例如超过个位数失败pippo999/pippo999.txt
。这可以通过设置extglob
选项来解决:当extglob
设置
shopt -s extglob
for file in `find . -name 'pippo*.txt'`; do
mv $file ${file/+([0-9]).txt/.txt}
done
的+(...)
结构在bash文件寻找才可用。
而是用一个循环,并cd
遍历目录树,这里采用find
获得所有相关文件的列表,然后遍历文件名的该列表,这将是这样的形式:./pippoN/pippoN.txt
。重命名使用bash parameter replacement获取修改的文件名。另请参阅filename expansion。
注意在文件或目录名称中的空格将打破这种方法,使用的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
的问题。现在路径中的空格将被正确处理,例如, ./pippo 9/pippo9.txt
也将重新命名为:./pippo 9/pippo.txt
。
有几个问题。 1)每个文件夹中只有1个文本文件吗? 2)你知道'sed'实际上并没有重命名文件吗?你需要使用'mv'。 – Squazic 2012-07-09 18:32:06
请更具体。难道这'bash'或'sh'和什么口味的Unix/Linux的是什么? – Anders 2012-07-09 18:39:13
是的!每个文件夹有1个.txt文件。我有完全14.669文件夹 – Elb 2012-07-09 19:59:14