Почему может -exec повлиять на вывод find в Linux?

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

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

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

  • Как выполнять несколько команд при использовании find?
  • Как искать в PDF-файлах с использованием регулярных выражений?
  • Как вернуть все ячейки в строке, если первый столбец соответствует значению на другом листе
  • Unix-type "locate" в Windows?
  • Как искать все текстовые файлы в одной папке для ключевого слова в Windows Vista
  • Как подсчитать разные значения / символы в столбце ячеек?
  •  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 {} \; 

    Как так?

  • Можно ли добавить ярлык для замены пути в Linux?
  • Нет двойной опции загрузки для Windows на моей машине
  • Можно ли установить Ubuntu Linux на FAT32 или NTFS?
  • Как Linux не подвержен вирусам, вредоносным программам и таким вещам?
  • Как определить количество физических процессоров под Windows и Linux
  • Изменить UUID под Linux?
  • 2 Solutions collect form web for “Почему может -exec повлиять на вывод find в Linux?”

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

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

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

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

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

    Однако я нашел альтернативу вашей проблеме.

     for file in $(find Documents/ -iname '*.txt' -or -iname '*.cpp'| awk '{print $1}'); do rm $file; done 
    Давайте будем гением компьютера.