Как удалить дублированные файлы на основе шаблона (см. примеры ниже), использование сценария или команды Bash

Мой вопрос прост:

Мне назвали видеофайлы следующим образом:

  • xxxx_yyy_720_3800.mp4
  • xxxx_yyy_720_8000.mp4

где yyy может варьироваться по длине (например, yyyyyy или больше y)

Поскольку я не используюсь в сценариях оболочки, я хотел бы удалить автоматически (в указанной папке)

  • Если файл с именем xxx_yyy_720_3800.mp4 существует и если файл xxx_yyy_720_8000.mp4 существует, удалить xxx_yyy_720_3800.mp4
  • Если существует только файл xxx_yyy_720_8000.mp4 и не файл xxx_yyy_720_3800.mp4, ничего не сделайте.

Любая справка значительно ценилась бы.

2
задан 15 July 2015 в 00:34

2 ответа

Используя find и gawk

  1. Установка gawk

    sudo apt-get install gawk
    
  2. Войдите в свою папку или замените . после find управляйте со своим foldername, например: find ~/my_video_duplicates f -iname …

  3. Протестируйте команду

    Команда ниже показывает только удалить кандидатам

    find . -type f -iname "*_8000.mp4" -print0 | \
        while read -d $'\0' file; do \
            gawk -F_ '{ \
                a=gensub(/\_8000\./, "_3800.", "g" , $0); \
                system("if [ -f \""a"\" ]; then echo \""a"\" will be deleted; fi")}' <<< "$file";\
        done
    
  4. Проверьте снова, если Вы находитесь в правильной папке или заменяете . после find управляйте со своим foldername, например: find ~/my_video_duplicates f -iname …

  5. Если Вы уверенный, выполняет команду ниже

    find . -type f -iname "*_8000.mp4" -print0 | \
        while read -d $'\0' file; do \
            gawk -F_ '{ \
                a=gensub(/\_8000\./, "_3800.", "g" , $0); \
                system("if [ -f \""a"\" ]; then rm \""a"\"; fi")}' <<< "$file";\
        done
    

Пример

  • Стартовая ситуация

    % ls -og
    total 3
    -rw-rw-r-- 1 0 Jul 14 19:37 xxxx_yyy_720_3800.mp4
    -rw-rw-r-- 1 0 Jul 14 19:20 xxxx_yyy_720_8000.mp4
    -rw-rw-r-- 1 0 Jul 14 19:21 aaaa_yyy_720_8000.mp4
    
  • Пробный прогон

    % find . -type f -iname "*_8000.mp4" -print0 | \
        while read -d $'\0' file; do \
            gawk -F_ '{ \
                a=gensub(/\_8000\./, "_3800.", "g" , $0); \
                system("if [ -f \""a"\" ]; then echo \""a"\" will be deleted; fi")}' <<< "$file";\
        done
    ./xxxx_yyy_720_3800.mp4 will be deleted
    
  • Удаление

    % find . -type f -iname "*_8000.mp4" -print0 | \
        while read -d $'\0' file; do \
            gawk -F_ '{ \
                a=gensub(/\_8000\./, "_3800.", "g" , $0); \
                system("if [ -f \""a"\" ]; then rm \""a"\"; fi")}' <<< "$file";\
        done
    
  • Заключительная ситуация

    % ls -og
    total 2
    -rw-rw-r-- 1 0 Jul 14 19:20 xxxx_yyy_720_8000.mp4
    -rw-rw-r-- 1 0 Jul 14 19:21 aaaa_yyy_720_8000.mp4
    
1
ответ дан 2 December 2019 в 03:53

Используя Bash Shell

[ -f "file" ] проверки, существует ли имя файла и является обычным файлом (например, не ссылка каталога или символьная ссылка)

"${name/%x/y}" заменяет суффикс x из $name с y.

Поэтому удалить xxx_yyy_720_3800.mp4 только если xxx_yyy_720_8000.mp4 существует, где xxx и yyy идентичны в каждом случае, for все *_*_720_3800.mp4 in текущий каталог:

for name in *_*_720_3800.mp4
do if [ -f "${name/%3800.mp4/8000.mp4}" ]
   then echo "$name"
   fi
done

Изменитесь echo кому: rm если Вы уверены, что это в порядке.

1
ответ дан 2 December 2019 в 03:53

Другие вопросы по тегам:

Похожие вопросы: