С find
необходимо активно искать файлы в файловой системе и доверять их меткам времени.
altenative в недавней системе Linux является inotify. В этом случае ядро наблюдает за изменениями файловой системы, как они происходят, и можно запросить их, например, с inotifywait -m
. Это должно дать Вам хорошую идею, что продолжается в режиме реального времени.
Подход inotify не работает хорошо при рекурсивном контроле больших деревьев каталогов. В этом случае find
даст Вам общее представление что каталоги контролировать.
dd status=none bs=1 count=50 if=${filename}
Это возвращает первые 50 байт.
-121--9543-Другой простейший способ (чем мой другой ответ) с помощью алгоритма awk и 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
!)
Для машины, такой как ваш 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 - один инструмент, одна работа, используйте их вместе, чтобы делать то, что вам нужно сделать.
Если предположить, что .DS_Store
представляют файлы, а не каталоги, то самым портативным и быстрым способом сделать это было бы:
sudo find / -name .DS_Store -exec rm {} +
Единственный риск - это то, что sudo
не будет доступен, но в настоящее время он довольно низок.
Вариант -delete
, используемый для запроса GNU find, до сих пор не является стандартным во многих других реализациях find
, так что он не всегда доступен.
-окончание команды +
вместо \;
сильно оптимизирует выражение exec
, не выполняя команду rm
для каждой и каждой .DS_Store
, присутствующей в файловой системе.