Удалить файлы определенного размера

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условия логически AND по умолчанию, поэтому просто выберите другой -sizeвариант для другой границы.
jw013
@ jw013 Отлично! Это подходит для меня. Благодарность! Пожалуйста, отправьте это как ваш ответ, и я приму это.
Юджин С.

Ответы:

7

Диапазон - это просто верхняя граница и нижняя граница. Из findспецификации :

выражение [-a] выражение

Соединение праймериз; Оператор AND подразумевается путем сопоставления двух основных цветов или становится явным с помощью необязательного оператора -a. Второе выражение не должно оцениваться, если первое выражение ложно.

Поэтому все, что вам нужно сделать, это указать обе границы размера перед -deleteдействием.

jw013
источник
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условия логически AND по умолчанию. Поэтому я просто добавил еще одно sizeусловие, и оно работало нормально! Финальная команда выглядит так:find . -maxdepth 1 -size +358c -size -395c -delete
Евгений С
7

Всякий раз, когда findожидается число, вы можете поставить +перед ним знак, означающий больше, чем это число, или -знак, означающий меньше, чем это число. Это строгие неравенства: +3а -7значит 4, 5 или 6.

Для -sizeпервичного вам необходимо добавить суффикс, cчтобы указать, что число представляет собой число байтов. Вы можете объединить несколько основных цветов, чтобы взять их соединение (в некоторых версиях вы можете поместить -aили -andмежду ними). Таким образом:

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

В zsh вы можете использовать L спецификатор glob . Единицей по умолчанию является байты; нравятся 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 $_: $!] 
        } 
    }
' *
Birei
источник
Спасибо за ваш ответ! Должна ли эта часть кода вводиться одной строкой?
Юджин С.
@EugeneS: да. Он должен работать, вставляя его в командную строку как есть или объединяя все строки в одну.
Бирей