найдите - исполнительная комната по сравнению с - удаляет

С find необходимо активно искать файлы в файловой системе и доверять их меткам времени.

altenative в недавней системе Linux является inotify. В этом случае ядро наблюдает за изменениями файловой системы, как они происходят, и можно запросить их, например, с inotifywait -m. Это должно дать Вам хорошую идею, что продолжается в режиме реального времени.

Подход inotify не работает хорошо при рекурсивном контроле больших деревьев каталогов. В этом случае find даст Вам общее представление что каталоги контролировать.

275
12.10.2015, 19:14
3 ответа
dd status=none bs=1 count=50 if=${filename}

Это возвращает первые 50 байт.

-121--9543-

Другой простейший способ (чем мой другой ответ) с помощью алгоритма и terdon :

awk 'NR>1 && /^[0-9]{8}/{printf "%s","\n"$0;next}{printf "%s",$0}END{print}' file
-121--42810-

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

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

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

EDIT per comment from @ doitmyway: убедитесь в совпадении имени и then delete, а не другого пути вокруг (delete, then match). В противном случае каждый файл будет удален независимо от соответствия . Т.Е. НЕ выполните следующее: find/-delete -name .DS_Store.

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

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

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

259
27.01.2020, 19:26

Для машины, такой как ваш MacBook, вы не найдете много различий в производительности между двумя командами. Однако, если вы посмотрите на версию -execeec, вы можете увидеть тонкое значение:

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 - один инструмент, одна работа, используйте их вместе, чтобы делать то, что вам нужно сделать.

16
27.01.2020, 19:26

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

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

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

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

-окончание команды + вместо \; сильно оптимизирует выражение exec, не выполняя команду rm для каждой и каждой .DS_Store, присутствующей в файловой системе.

28
27.01.2020, 19:26

Теги

Похожие вопросы