3

Если я запускаю эту команду ...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db"

... это дает мне список подходящих файлов, как и ожидалось. Однако, если я использую эту команду ...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db" -exec rm -v {} \;

... ничего не удалено. Точно так же с эхом ничего не печатается ...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db" -exec echo {} \;

Как так?

2 ответа2

2

Вы должны правильно сгруппировать свое выражение - в настоящее время -exec применяется только к последней ветке -or .

sudo find /storage \( -name "*~" -or -name ".*~" -or -name "#.*#" -or -name ".DS_Store" -or -name "Thumbs.db" \) -exec rm -v {} \;

Просто помните, что -exec - это просто выражение, которое возвращает true, если команда возвращает ноль, поэтому выполнение команды является просто побочным эффектом.

0
find Documents/ -iname '*.txt' -exec echo {} \;
 -or -iname '*.cpp' -exec echo {} \;

Это, однако, работает. Надеюсь, что это поможет вам немного дальше. Если вы используете exec отдельно со всеми-или, команда будет работать.

Я нашел альтернативу вашей проблеме, хотя.

for file in $(find Documents/ -iname '*.txt' 
-or -iname '*.cpp'| awk '{print $1}'); do rm $file; done

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