@DanielAndersson: findограничивает количество аргументов для вызываемого процесса, чтобы вписаться в ограничения системы, в отличие от того rm *, который гарантированно является одним вызовом процесса. при необходимости findвызовет несколько экземпляров rm. И я уверен, что специальные символы обрабатываются правильно, включая символы новой строки. Я предпочитаю -exec rmболее -deleteиз соображений гибкости - в качестве примера, последний не предлагает способа удаления файлов, защищенных от записи.
Свен Марнач
1
@Invoker: я отменил ваше изменение, так как оно было неверным. -1Mозначает менее одного мегабайта по желанию. Ваша версия удалит все файлы размером ровно в один мегабайт, что выглядит несколько бессмысленной операцией.
Свен Марнах
2
Если вы хотите удалить все файлы размером более 1М, используйте команду find . -type f -size +1M -exec rm {} +. Обратите внимание на + 1M вместо -1M.
@ Invoker, я считаю, что это -знак минус, означающий «менее 1 млн». Если вы запустите, find <directory> -type f -size +1M -deleteвы удалите все файлы размером более 1M.
chessofnerd
да, ты прав, мой плохой
Invoker
2
Просто для разнообразия и возможного (возможно, предельного) прироста производительности:
find <directory>-type f -size -1M-print0 | xargs -0 rm
Как это должно быть быстрее? Начинается дополнительный xargsпроцесс.
Свен Марнах
Теперь вы можете иметь два процессора, борющихся за одно и то же блочное устройство! Более разумно, что операции stat / readdir не блокируются синхронно операцией unlink. Вероятность того, что это будет лучше, очевидно, зависит от размера поддерева, количества файлов, устройства и т. Д.
Ответы на SO должны быть автономными - не размещайте просто ссылку. (Более того, код в связанном посте удаляет пустые файлы, а не файлы размером менее 1 млн.)
Свен Марнач
@SvenMarnach не можем использовать $ file_size <1M в приведенной ссылке примера кода.
Нет, мы не можем, так как оболочка не поймет 1M.
Свен Марнах
Под 1М я подразумевал 1048576, преобразовывающий 1МБ в байт
1
Что ж, если вы проверите, действительно ли это работает и скопируете код в свой ответ, это может стать SO-ответом.
Ответы:
Это можно сделать с помощью
find
:Обратите внимание, что это рекурсивно сойдет в подкаталоги и безоговорочно удалит все файлы размером менее 1 мегабайта. Быть осторожен.
источник
find
find
. :)find
ограничивает количество аргументов для вызываемого процесса, чтобы вписаться в ограничения системы, в отличие от тогоrm *
, который гарантированно является одним вызовом процесса. при необходимостиfind
вызовет несколько экземпляровrm
. И я уверен, что специальные символы обрабатываются правильно, включая символы новой строки. Я предпочитаю-exec rm
более-delete
из соображений гибкости - в качестве примера, последний не предлагает способа удаления файлов, защищенных от записи.-1M
означает менее одного мегабайта по желанию. Ваша версия удалит все файлы размером ровно в один мегабайт, что выглядит несколько бессмысленной операцией.find . -type f -size +1M -exec rm {} +
. Обратите внимание на + 1M вместо -1M.Это должно сделать работу:
источник
-
знак минус, означающий «менее 1 млн». Если вы запустите,find <directory> -type f -size +1M -delete
вы удалите все файлы размером более 1M.Просто для разнообразия и возможного (возможно, предельного) прироста производительности:
источник
xargs
процесс.Пытаться
источник
\;
в конце вместо+
Вы можете проверить эту ссылку http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , она имеет именно то, что вы хотите.
Вы можете перебрать все файлы с помощью цикла for, а затем использовать du и awk, чтобы найти размер файла, как в приведенном выше примере.
источник
1M
.