我在一个文件夹中有一堆视频文件,有一个双后缀 avi.avi。
find /home/alex/Filme/ -type f -name '*.avi.avi'
/home/alex/Filme/Super 8.avi.avi
/home/alex/Filme/Exit - A Night From Hell.avi.avi
/home/alex/Filme/Der Plan.avi.avi
/home/alex/Filme/Ich.bin.Nummer.4.2011.avi.avi
snipp
我尝试使用以下“脚本”删除双字符串
#!/bin/bash
for i in `find $HOME/Filme -type f -name '*avi.avi' -print0`
do
sed -e 's/'*.avi.avi'/'*.avi'/g'
done
或者是通过重命名来实现此目的的更好方法,就像这样?
find $HOME/Filme -type f -name '*avi.avi' -print0 -exec sh -c rename -v 's/*.avi.avi/*.avi/g' {} \;
我不确定文件夹名称是否会被保留。是的,我为此找到了几个问题和答案,但我在使其适应我的情况时遇到问题。
我的其中一种方法有效吗?
答案1
你就快到了。
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c "rename -v 's/\.avi\.avi$/.avi/'" {} \;
( 的参数rename
是正则表达式替换;只有/g
当您想要替换匹配文件名中的每个匹配项时,该选项才有用;但根据定义,最后只能有一个匹配项。)
也许更有用的是,您可以批处理此操作,并且可能只是用于mv
提高可移植性。
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c 'for f; do mv -v "$f" "${f%.avi}"; done' _ {} +
如果不需要遍历子目录,
for f in $HOME/Filme/*.avi.avi; do
mv -v "$f" "${f%.avi}"
done
答案2
用简单的改名(珀尔实施)命令:
rename 's/(.*\.avi)\.avi$/$1/' /home/alex/Filme/*.avi.avi
或者只删除最后.avi
一部分:
rename 's/\.avi$//' /home/alex/Filme/*.avi.avi
答案3
我使用此代码来重命名此类文件
rename -v "s/\.avi$//g" *