Рекурсивно видаляйте файли, розмір яких не перевищує 1 Мб


Відповіді:


21

Це можна зробити за допомогою find:

find . -type f -size -1M -exec rm {} +

Зауважте, що це буде рекурсивно спускатися до підкаталогів і безумовно видаляти всі файли розміром менше 1 мегабайт. Будь обережний.


ви пропускаєте аргумент шляху доfind

@Useless: Це GNU find. :)
Свен Марнах

2
@DanielAndersson: findобмежує кількість аргументів викликаному процесу, щоб він вписувався в обмеження системи, на відміну від rm *, який гарантується як один виклик процесу. findза потреби викличе кілька примірників rm. І я майже впевнений, що до спеціальних символів трактуються правильно, включаючи символи нового рядка. Я вважаю -exec rmза краще з -deleteміркувань гнучкості - як приклад, останній не пропонує способу видалення файлів, захищених від запису.
Свен Марнах

1
@Invoker: Я змінив вашу зміну, оскільки вона була неправильною. -1Mозначає менше, ніж один мегабайт за бажанням. Ваша версія видалила б усі файли розміром рівно одного мегабайти, що здається дещо безглуздою операцією.
Свен Марнах

2
Для всіх, хто бажає, якщо ви хочете видалити всі файли більше 1М, скористайтеся командою find . -type f -size +1M -exec rm {} +. Зверніть увагу на + 1М замість -1М.
chessofnerd

10

Це має зробити цю роботу:

$ find <directory> -type f -size -1M -delete

Я не думаю, що нам потрібно випускати дефіс з 1М.
Invoker

2
@Invoker, я вважаю, що -знак є знаком мінус, що означає "менше 1М". Якщо ви запустите, find <directory> -type f -size +1M -deleteви видалите всі файли розміром більше 1М.
chessofnerd

так, ти маєш рацію, моє погано
Invoker

2

Просто для різноманітності та можливого (можливо, граничного) підвищення продуктивності:

find <directory> -type f -size -1M -print0  | xargs -0 rm

Як це має бути швидше? Він запускає додатковий xargsпроцес.
Свен Марнах

Тепер ви можете мати два процесори, що змагаються за один і той же блок пристрою! Більш чітко, операції stat / readdir не синхронно блокуються операцією від’єднання. Чи буде це краще, очевидно, залежить від розміру підкресленого дерева, кількості файлів, пристрою тощо

1

Спробуйте

знайти. -розмір -1M -exec rm {} \;


1
Це чудово для користувачів, які не є GNU. Спасибі! те саме, що відповідь @ Свена, але з \;кінцем замість+
hamx0r

-1

Ви можете ознайомитись із цим посиланням http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , у ньому є саме те, що ви хочете.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

Ви можете переглядати всі файли з циклом for, а потім використовувати du та awk, щоб знайти розмір файлів, як у наведеному вище прикладі.


Відповіді на ТА повинні бути самостійними - не публікуйте посилання. (Більше того, код у зв’язаній публікації видаляє порожні файли, а не файли менше 1М.)
Sven Marnach

@SvenMarnach не можемо використовувати $ file_size <1M у вказаному прикладі коду.

Ні, ми не можемо, оскільки оболонка не зрозуміє 1M.
Свен Марнах

Під 1М я мав на увазі 1048576 перетворення 1МБ в байт

1
Добре, якщо ви перевірите, чи справді це працює, і скопіюєте код у свою відповідь, це може стати відповіді "ТАК".
Свен Марнах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.