Shell脚本删除某些文件并重命名其他文件

时间:2018-12-06 19:07:48

标签: shell

目前,我有很多.mp4文件,它们的名称如下:

103160626309temp1ep10.mp4
103160626309temp1ep10.mp4.mp4

148999555452temp1ep6.mp4
148999555452temp1ep6.mp4.mp4

6802547045temp1ep5.mp4
6802547045temp1ep5.mp4.mp4

335587012366temp1ep4.mp4
335587012366temp1ep4.mp4.mp4
...

我必须删除所有带有单个.mp4的文件,并将.mp4.mp4重命名为.mp4。您对我该怎么办吗?

我考虑使用:

for i in ./*.mp4; do
...

for i in ./*.mp4.mp4; do
...

但是我很害怕,我不能丢失文件或损坏它们。

您能帮我解决这个问题吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

如果仅将.mp4.mp4文件上的.mp4文件重命名,则不需要单独的删除步骤。

(这假定每个.mp4文件都有一个对应的.mp4.mp4文件。如果不是这种情况,请参见下面的“多个步骤”说明。)

有几种方法可以做到这一点:

  • 普通外壳:

    for file in *.mp4.mp4; do
        mv -- "$file" "${file%.mp4}"
    done
    

    (使用echo而非mv来查看它的作用,然后再“真正”运行。)

  • 如果您拥有rename的perl版本(有时也称为prenameperl-rename):

    rename -f 's/\.mp4\.mp4\z/.mp4/' *.mp4.mp4
    

    (使用rename -n进行试运行。)

  • 如果您具有rename的util-linux版本:

    rename .mp4.mp4 .mp4 *.mp4.mp4
    

    当心;这将仅替换文件名中第一次出现的.mp4.mp4,但希望它将始终位于文件名的末尾。

    (再次使用rename -n进行空试。)

  • 如果您有mmv

    mmv -d '*.mp4.mp4' '#1.mp4'
    

如果要分多个步骤进行操作:

  1. 为要保留的文件创建一个单独的目录:

    mkdir to-be-kept
    
  2. 将所有.mp4.mp4文件移动到该目录:

    mv *.mp4.mp4 to-be-kept/
    
  3. 删除所有剩余的.mp4文件(或将它们移到其他位置):

    rm *.mp4
    

    或将其移至其他位置:

    mv *.mp4 some/other/directory
    
  4. .mp4.mp4文件移回:

    mv to-be-kept/* .
    rmdir to-be-kept
    
  5. 使用上述食谱之一进行重命名。

    您不需要rename -f(改为使用普通的rename)或mmv -d(改为使用普通的mmv),因为在这种情况下,无需覆盖现有文件