find - exec rm vs -delete


260

Я пытаюсь понять разницу между этими двумя командами:

sudo find / -name .DS_Store -delete

а также

sudo find / -name ".DS_Store"  -exec rm {} \;

Я заметил, что execметод является предпочтительным. Почему? Какой из них безопаснее / быстрее / лучше? Я использовал оба на своем Macbook, и все, кажется, работает хорошо.

Ответы:


245

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

Вполне возможно, что вы можете увидеть -exec rm {} \;часто рекомендуется, потому -deleteчто не существует во всех версиях find. Я не могу проверить прямо сейчас, но я уверен, что использовал findбез него.

Оба метода должны быть «безопасными».

РЕДАКТИРОВАТЬ за комментарий от @doitmyway: убедитесь, что вы соответствуете имени, а затем удалите, а не наоборот (удалите, затем сопоставьте). В противном случае каждый файл будет удален, независимо от того, совпадает он или нет . Т.е. НЕ делай этого find / -delete -name .DS_Store.

Распространенный метод, позволяющий избежать накладных расходов на порождение внешнего процесса для каждого соответствующего файла:

find / -name .DS_Store -print0 | xargs -0 rm

(но учтите, что здесь также есть проблема переносимости: не все версии find имеют -print0!)


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

8
В последнее время findвы можете использовать -exec rm {} +для удаления всех совпадающих файлов с помощью одной rmкоманды.
Джимми

3
.DS_Storeвообще не содержит никаких специальных символов, поэтому кавычки не нужны и в этом случае ничего не меняются.
Celada

1
В основном только пробелы (пробелы, табуляции, возможно, другие) - это единственное, что приводит к тому, что строка без кавычек интерпретируется как два отдельных аргумента командной строки, но это не все, о чем вы должны сожалеть, когда решаете, заключать в кавычки или нет. Вы должны беспокоиться обо всех метасимволах оболочки, таких как ;или |или >или, <и ``, и многих других, которые имеют особое значение для оболочки, если они не заключены в кавычки.
Celada

1
@MarcoMarsala xargsпрозрачно решает проблему списка аргументов ограниченного размера, разбивая его на несколько вызовов команды.
Селада

27

Предполагая, что .DS_Storeпредставляют файлы, а не каталоги, самый переносимый и быстрый способ сделать это:

sudo find / -name .DS_Store -exec rm {} +

Единственный риск - sudoэто быть недоступным, но в настоящее время он достаточно низок.

-deleteПараметр , используемый , чтобы потребовать GNU найти и до сих пор не стандарт во многих других findреализациях, поэтому не всегда доступен.

Прекращение команды +вместо \;оптимизации оптимизирует execпредложение, не выполняя rmкоманду для каждого элемента .DS_Storeв файловой системе.


16

Для такой машины, как ваш macbook, вы не найдете большой разницы в производительности между этими двумя командами. Однако, если вы посмотрите на версию -exec, вы увидите небольшую разницу:

sudo find / -iname ".file-to-delete"  -exec rm {} \;

Это означает, что вы найдете все эти файлы с именем «.file-to-delete». Однако этот поиск может вернуть некоторые нежелательные ложные срабатывания. Делая что-то с sudo, вы должны быть немного осторожнее. Преимущество использования -exec rm {} заключается в том, что вы можете передавать аргументы в rm следующим образом:

sudo find / -iname "*~"  -exec rm -i {} \;

В этом примере я хочу удалить те файлы резервных копий, которые делает emacs. Однако эта тильда может быть в каком-то непонятном файле, о котором я не знаю, и может быть важным. Плюс хочу подтвердить удаление. Поэтому я добавил опцию '-i' в команду rm. Это даст мне интерактивное удаление.

Также вы можете уточнить использование rm для удаления каталогов и файлов:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

Вкратце, -exec дает вам немного больше контроля над самой командой, которая удаляет найденный элемент. Преимущество заключается в том, что вы используете один инструмент для поиска файлов, другой инструмент для их удаления. Также не каждая версия утилиты поиска имеет опцию -delete. Поэтому лучше использовать каждый инструмент для его правильной работы. Это философия Unix - один инструмент, одна работа, используйте их вместе, чтобы делать то, что вам нужно.


3
Смотрите также -ok rm {} \;вместо -exec rm {} \;интерактивного подтверждения.
Кусалананда
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.