Видаліть файли певного діапазону розмірів


12

Я хочу видалити файли, розмір яких знаходиться між певними значеннями. Наприклад, у мене є такий список файлів:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

З наведеного вище списку я хочу видалити лише ті файли, розмір яких змінюється між 386b та 390b . Я знаю, що я можу використовувати таку команду для видалення файлів, розмір яких перевищує певний <size>:

find . -size +<size>-delete

Але як я можу додати ще одну межу для файлів, розмір яких менший за задане значення?


4
findумови є логічно ТА за замовчуванням, тому просто натисніть на інший -sizeваріант для іншого зв'язаного.
jw013

@ jw013 Чудово! Це працює для мене. Дякую! Будь ласка, опублікуйте це як свою відповідь, і я прийму його.
Євген S

Відповіді:


7

Діапазон - це просто верхня межа І нижня межа. З findспецифікації :

вираз [-а] вираз

Сполучення праймеріз; оператор AND мається на увазі шляхом складання двох праймеріз або робиться явним необов'язковим оператором -a. Другий вираз не оцінюється, якщо перший вираз помилковий.

Тому все, що вам потрібно зробити, - це вказати обидва межі розміру перед -deleteдією.


8

Оператор -aявного ANDоператора, який дозволяє з'єднати два праймери. У цьому випадку створення діапазону з використанням -size.

find . -size +386b -a -size -390b -exec rm -f {} \;

Зверніть увагу, що розмір - це числовий аргумент, який необов'язково може бути попереджено за допомогою +та -. Від man 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

Спасибі за вашу відповідь. Однак, як згадував @ jw013 у своєму коментарі, findумови є логічно ТА за замовчуванням. Тож я просто додав ще одну sizeумову, і вона спрацювала чудово! Фінальна команда виглядає так:find . -maxdepth 1 -size +358c -size -395c -delete
Євген S

7

Щоразу, коли findочікується число, ви можете поставити +перед ним знак, який означатиме більше, ніж це число, або -знак означатиме менше, ніж це число. Це суворі нерівності: +3і -7означає 4, 5 або 6.

За допомогою -sizeосновного потрібно додати суфікс, cщоб вказати, що число - це кількість байтів. Ви можете об'єднати кілька праймеріз, щоб зв'язати їх (у деяких версіях ви можете ставити -aабо -andміж ними). Таким чином:

find . -size +385c -size -391c -delete

У zsh можна використовувати L глобальний класифікатор . За замовчуванням одиниця - байти; як find, символи +і -вказують на суворі нерівності.

rm *(L+385-391)

(Команда вище не повторюється у підкаталогах; якщо вам це потрібно, додайте **/перед шаблоном.)


Я не розумію +3 і -7, що дорівнює 4, 5 або 6. Чи можете ви пояснити?
Хашим

1

Один із способів використання perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

Спасибі за вашу відповідь! Чи слід цю частину коду вводити як єдиний рядок?
Євген S

@EugeneS: Так. Слід вставити його у свій командний рядок як є чи об'єднати всі рядки в один.
Бірей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.