我必须制作一个重命名当前目录中所有文件的单行程序 以“.hola”结尾为“.txt”。
例如:
sample.hola and name.hi.hola
将分别重命名为sample.txt
和name.hi.txt
我在考虑类似的事情:
ls -1 *.hola | awk '{NF="";print "$0.hola $0.txt"}'
(*)
然后使用xargs mv -T
|
但示例中(*)的输出为sample
和name hi
。
如何使用name.hi
获取name.hi.hola
的输出awk
?
答案 0 :(得分:3)
为什么要让awk参与其中?
$ for f in *.hola; do echo mv "$f" "${f%hola}txt"; done
mv name.hi.hola name.hi.txt
mv sample.hola sample.txt
当您对输出感到满意时,请移除echo
。
答案 1 :(得分:1)
那么,对于您的具体问题,我建议使用rename
命令。根据系统上的版本,您可以执行rename -s .hola .txt *.hola
或rename 's/\.hola$/.txt/' *.hola
。
此外,您不应使用ls
来获取文件名。当您运行ls *.hola
时, shell 会将*.hola
扩展为与该模式匹配的所有文件名列表,而ls
只是一个荣耀的echo
在那时候。您可以使用例如获得相同的结果printf '%s\n' *.hola
没有在shell外运行任何程序。
您的awk
错过任何删除.hola
的尝试。如果你有GNU awk,你可以这样做:
awk -F. '{old=$0; NF-=1; new=$0".txt"; print old" "new}'
这不适用于BSD / MacOS awk
。在这种情况下,你可以这样做:
awk -F. '{
old=$0; new=$1;
for (i=2;i<NF;++i) { new=new"."$i };
print old" "new".txt"; }'
无论哪种方式,我都相信@EdMorton可能有一个更好的基于awk
的解决方案。
答案 2 :(得分:0)
这个怎么样?简单明了:
for file in *.hola; do mv "$file" "${file/%hola/txt}"; done