使用 sed 从文件名中移动字符串或使用 rename 重命名它们

使用 sed 从文件名中移动字符串或使用 rename 重命名它们

我在一个文件夹中有一堆视频文件,有一个双后缀 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" *

相关内容