Рекурсивно искать файлы RAR и извлекать их, после их извлечения, удалять их

Я хотел бы рекурсивно искать папку, извлекать RAR-файл и удалять .nfo, .svf и RAR-файлы (* .rar и * .r1, * .r2 и т. д.).

Я нашел команду для рекурсивного извлечения, но не для удаления:

find ./ -name '*.rar' -exec unrar e {} \;
5
задан 10 April 2017 в 22:06

3 ответа

Отбросить другой предикат -exec (с rm внутри этого), который будет запускаться только в том случае, если первый преуспеет:

find . -name '*.rar' -exec unrar e {} \; -exec rm {} \;

-exec rm {} \; будет запущен только для удаления .rar, если успешное выполнение unrar (-exec unrar e {} \;), т.е. unrar, возвращается с статусом выхода 0.

Вы также можете сделать это, используя bash, используя опцию globstar для рекурсивного соответствия шаблону glob (*.rar) и rm каждого файла, если unrar -из успешно:

shopt -s globstar for f in **/*.rar; do unrar e "$f" && rm "$f" done
5
ответ дан 18 July 2018 в 15:14

Отбросить другой предикат -exec (с rm внутри этого), который будет запускаться только в том случае, если первый преуспеет:

find . -name '*.rar' -exec unrar e {} \; -exec rm {} \;

-exec rm {} \; будет запущен только для удаления .rar, если успешное выполнение unrar (-exec unrar e {} \;), т.е. unrar, возвращается с статусом выхода 0.

Вы также можете сделать это, используя bash, используя опцию globstar для рекурсивного соответствия шаблону glob (*.rar) и rm каждого файла, если unrar -из успешно:

shopt -s globstar for f in **/*.rar; do unrar e "$f" && rm "$f" done
5
ответ дан 24 July 2018 в 20:35
  • 1
    Хорошо, спасибо! Я побежал find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; в тестовую папку, содержащую разделенный архив rar. * .r01, * .r02, * .r03 и т. д., а также файл * .rar. Файл * .rar был удален, но не остальная часть архива. Файлы сегментов rar все еще были там (.r01, r02, r03, r04 ..) – Adam 10 April 2017 в 17:56
  • 2
    @Adam. Вы сопоставляете только файлы .rar с -name '*.rar', попробуйте: find . -regextype posix-egrep -regex '.*\.r([[:digit:]]+|ar)$' -exec unrar e {} \; -exec rm {} \; – heemayl 10 April 2017 в 18:09
  • 3
    Еще раз спасибо! Но теперь я пытаюсь разобрать все сегменты. Может быть, найти rar и удалить rar и .*\.r([[:digit:]]+|ar)$? – Adam 10 April 2017 в 20:52
  • 4
    @Adam, я вижу, просто добавьте удаление сегментов при успешном выполнении: find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; && rm *.r+([[:digit:]]) (предполагается, что опция extglob для bash установлена, которая по умолчанию, в противном случае установлена ​​с shopt -s extglob в первую очередь) – heemayl 10 April 2017 в 21:10

Отбросить другой предикат -exec (с rm внутри этого), который будет запускаться только в том случае, если первый преуспеет:

find . -name '*.rar' -exec unrar e {} \; -exec rm {} \;

-exec rm {} \; будет запущен только для удаления .rar, если успешное выполнение unrar (-exec unrar e {} \;), т.е. unrar, возвращается с статусом выхода 0.

Вы также можете сделать это, используя bash, используя опцию globstar для рекурсивного соответствия шаблону glob (*.rar) и rm каждого файла, если unrar -из успешно:

shopt -s globstar for f in **/*.rar; do unrar e "$f" && rm "$f" done
5
ответ дан 31 July 2018 в 23:37
  • 1
    Хорошо, спасибо! Я побежал find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; в тестовую папку, содержащую разделенный архив rar. * .r01, * .r02, * .r03 и т. д., а также файл * .rar. Файл * .rar был удален, но не остальная часть архива. Файлы сегментов rar все еще были там (.r01, r02, r03, r04 ..) – Adam 10 April 2017 в 17:56
  • 2
    @Adam. Вы сопоставляете только файлы .rar с -name '*.rar', попробуйте: find . -regextype posix-egrep -regex '.*\.r([[:digit:]]+|ar)$' -exec unrar e {} \; -exec rm {} \; – heemayl 10 April 2017 в 18:09
  • 3
    Еще раз спасибо! Но теперь я пытаюсь разобрать все сегменты. Может быть, найти rar и удалить rar и .*\.r([[:digit:]]+|ar)$? – Adam 10 April 2017 в 20:52
  • 4
    @Adam, я вижу, просто добавьте удаление сегментов при успешном выполнении: find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; && rm *.r+([[:digit:]]) (предполагается, что опция extglob для bash установлена, которая по умолчанию, в противном случае установлена ​​с shopt -s extglob в первую очередь) – heemayl 10 April 2017 в 21:10

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

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