Удаление файлов определенного диапазона размеров

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

-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> , я могу использовать следующую команду:

  • Как переформатировать порядковые номера в партии имен файлов, например A1.txt, до A0001.txt?
  • Передача аргументов с кавычками и двойными значениями в сценарий bash
  • как добавить дополнительный символ после поиска слова
  • Поддерживает ли `` поиск нескольких условий `maxdepth`?
  • Простое регулярное выражение Bash соответствует отсутствующему символу (OS X)
  • Отправить пароль с помощью sudo и выполнить скрипт с nohup
  •  find . -size +<size>-delete 

    Но как я могу добавить еще одну границу для файлов, размер которых меньше заданного значения?

  • Можно ли заменить / изменить аргумент с помощью bash bang (!) И истории
  • Как разбить имя файла на указанный разделитель
  • Как найти список файлов и закрепить их в одном ZIP-файле?
  • Как создать панель запуска графического интерфейса для xfce4-терминала с рыбой, но наследуя переменные среды из bash?
  • Bash: разрешение отклонено при попытке эхо-передачи данных непосредственно в сеть
  • Почему UNIX-оболочки похожи на это и как я могу обойти это?
  • 4 Solutions collect form web for “Удаление файлов определенного диапазона размеров”

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

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

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

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

    -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. 

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

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

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

    В zsh вы можете использовать квалификатор L glob . Единица по умолчанию – байты; как find , символы + и - указывают на строгие неравенства.

     rm *(L+385-391) 

    (Команда выше не рекурсирует в подкаталоги, и если вам это нужно, добавьте **/ перед шаблоном.)

    Один из способов использования perl :

     perl -e ' for ( @ARGV ) { if ( -s >= 386 && -s _ <= 390 ) { unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] } } ' * 
    Linux и Unix - лучшая ОС в мире.