Я пытаюсь понять разницу между этими двумя командами:
sudo find / -name .DS_Store -delete
а также
sudo find / -name ".DS_Store" -exec rm {} \;
Я заметил, что execметод является предпочтительным. Почему? Какой из них безопаснее / быстрее / лучше? Я использовал оба на своем Macbook, и все, кажется, работает хорошо.
-delete будет работать лучше, потому что он не должен порождать внешний процесс для каждого соответствующего файла.
Вполне возможно, что вы можете увидеть -exec rm {} \;часто рекомендуется, потому -deleteчто не существует во всех версиях find. Я не могу проверить прямо сейчас, но я уверен, что использовал findбез него.
Оба метода должны быть «безопасными».
РЕДАКТИРОВАТЬ за комментарий от @doitmyway: убедитесь, что вы соответствуете имени, а затем удалите, а не наоборот (удалите, затем сопоставьте). В противном случае каждый файл будет удален, независимо от того, совпадает он или нет . Т.е. НЕ делай этого find / -delete -name .DS_Store.
Распространенный метод, позволяющий избежать накладных расходов на порождение внешнего процесса для каждого соответствующего файла:
find / -name .DS_Store -print0 | xargs -0 rm
(но учтите, что здесь также есть проблема переносимости: не все версии find имеют -print0!)
Понимаю. Я также читал, что использование -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в файловой системе.
Для такой машины, как ваш macbook, вы не найдете большой разницы в производительности между этими двумя командами. Однако, если вы посмотрите на версию -exec, вы увидите небольшую разницу:
Это означает, что вы найдете все эти файлы с именем «.file-to-delete». Однако этот поиск может вернуть некоторые нежелательные ложные срабатывания. Делая что-то с sudo, вы должны быть немного осторожнее. Преимущество использования -exec rm {} заключается в том, что вы можете передавать аргументы в rm следующим образом:
sudo find / -iname "*~" -exec rm -i {} \;
В этом примере я хочу удалить те файлы резервных копий, которые делает emacs. Однако эта тильда может быть в каком-то непонятном файле, о котором я не знаю, и может быть важным. Плюс хочу подтвердить удаление. Поэтому я добавил опцию '-i' в команду rm. Это даст мне интерактивное удаление.
Также вы можете уточнить использование rm для удаления каталогов и файлов:
Вкратце, -exec дает вам немного больше контроля над самой командой, которая удаляет найденный элемент. Преимущество заключается в том, что вы используете один инструмент для поиска файлов, другой инструмент для их удаления. Также не каждая версия утилиты поиска имеет опцию -delete. Поэтому лучше использовать каждый инструмент для его правильной работы. Это философия Unix - один инструмент, одна работа, используйте их вместе, чтобы делать то, что вам нужно.
-delete
переключателя перед-name
удалением указанного дерева файлов, поэтому я должен быть осторожным.find
вы можете использовать-exec rm {} +
для удаления всех совпадающих файлов с помощью однойrm
команды..DS_Store
вообще не содержит никаких специальных символов, поэтому кавычки не нужны и в этом случае ничего не меняются.;
или|
или>
или,<
и ``, и многих других, которые имеют особое значение для оболочки, если они не заключены в кавычки.xargs
прозрачно решает проблему списка аргументов ограниченного размера, разбивая его на несколько вызовов команды.Предполагая, что
.DS_Store
представляют файлы, а не каталоги, самый переносимый и быстрый способ сделать это:Единственный риск -
sudo
это быть недоступным, но в настоящее время он достаточно низок.-delete
Параметр , используемый , чтобы потребовать GNU найти и до сих пор не стандарт во многих другихfind
реализациях, поэтому не всегда доступен.Прекращение команды
+
вместо\;
оптимизации оптимизируетexec
предложение, не выполняяrm
команду для каждого элемента.DS_Store
в файловой системе.источник
Для такой машины, как ваш macbook, вы не найдете большой разницы в производительности между этими двумя командами. Однако, если вы посмотрите на версию -exec, вы увидите небольшую разницу:
Это означает, что вы найдете все эти файлы с именем «.file-to-delete». Однако этот поиск может вернуть некоторые нежелательные ложные срабатывания. Делая что-то с sudo, вы должны быть немного осторожнее. Преимущество использования -exec rm {} заключается в том, что вы можете передавать аргументы в rm следующим образом:
В этом примере я хочу удалить те файлы резервных копий, которые делает emacs. Однако эта тильда может быть в каком-то непонятном файле, о котором я не знаю, и может быть важным. Плюс хочу подтвердить удаление. Поэтому я добавил опцию '-i' в команду rm. Это даст мне интерактивное удаление.
Также вы можете уточнить использование rm для удаления каталогов и файлов:
Вкратце, -exec дает вам немного больше контроля над самой командой, которая удаляет найденный элемент. Преимущество заключается в том, что вы используете один инструмент для поиска файлов, другой инструмент для их удаления. Также не каждая версия утилиты поиска имеет опцию -delete. Поэтому лучше использовать каждый инструмент для его правильной работы. Это философия Unix - один инструмент, одна работа, используйте их вместе, чтобы делать то, что вам нужно.
источник
-ok rm {} \;
вместо-exec rm {} \;
интерактивного подтверждения.