2

Я использую этот скрипт:

find $convfold -name \*.mkv -o -name \*.avi -o -name \*.mov -o -name \*.wmv -o -name \*.m4p -o -name \*.m4v -o -name \*.mpg -o -name \*.mp2 -o -name \*.mpeg -o -name \*.mpe -o -name \*.mpv -o -name \*.m2v -o -name *.m4v -delete

где $convfold - это переменная для папки, в которой я удаляю видео.

Если я -delete из кода, он отображает файлы, которые он должен удалить, но когда он у меня есть в коде, я не получаю ни ошибок возврата, ни исключений.

Пример:

flynn@Tron:~/FilebotHandbrake/testconverting$ find -name \*.mkv -o -name \*.mp4 -o -name \*.avi 
./TV Shows/Mr. Robot/Season 02/Mr. Robot - S02E02 - eps2.0_unm4sk-pt2.tc.mkv
./TV Shows/Mr. Robot/Season 02/Mr. Robot - S02E01 - eps2.0_unm4sk-pt1.tc.mkv

Любая помощь или предложения будут оценены.

1 ответ1

2

Проблема в том, что с find , Logic-and связывается более жестко, чем Logical-или. Заметим:

$ ls
file1  file2  file3  file4
$ find . -name \*1 -o -name \*2 -exec echo {} \;
./file2

В приведенном выше -name \*2 и -exec echo {} \; связаны между собой подразумеваемым логическим-и. Этот логический-и связывает сильнее , чем логический или, -o который соединяет первый -name ко второму.

Чтобы избежать этого, вам нужно применить паренсы для группировки:

$ find . \( -name \*1 -o -name \*2 \) -exec echo {} \;
./file1
./file2

Или, для вашей полной команды:

find $convfold \( -name \*.mkv -o -name \*.avi -o -name \*.mov -o -name \*.wmv -o -name \*.m4p -o -name \*.m4v -o -name \*.mpg -o -name \*.mp2 -o -name \*.mpeg -o -name \*.mpe -o -name \*.mpv -o -name \*.m2v -o -name *.m4v \) -delete

Документация

От man find:

Обратите внимание, что -a если он указан неявно (например, двумя тестами, появляющимися без явного оператора между ними) или явно имеет более высокий приоритет, чем -o . Это значит, что find . -name afile -o -name bfile -print никогда не печатает файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .