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

Zsh пытается быть умным в выборе завершений, но это не достаточно умно, чтобы знать это после doctrine --configuration=, это должно завершить имя файла. Bash или достаточно умен для парсинга этой команды правильно, или слишком глупый для завершения чего-либо кроме имени файла здесь.

Можно записать функцию завершения для doctrine. Это немного совершенствуется, хотя — функции завершения имеют тенденцию быть немного тайными. Можно найти легче записать completer использование альтернативной, более старой, более простой, но менее мощной системы завершения zsh, compctl (зарегистрированный в zshcompctl страница справочника).

Если у Вас есть функция завершения удара для doctrine, Вы смогли заставлять zsh читать его включением autoload bashcompinit; bashcompinit в Вашем ~/.zshrc. Посмотрите Переключение с удара на zsh Wiki.

Можно найти полезным связать несколько ключей к _bash_complete-word. Этот виджет (интерактивная команда) выполняет завершение нескольких встроенных типов, в зависимости от последнего знака в сочетании клавиш, которое вызвало виджет: / для каталогов, $ для названий параметра, и т.д. Например, включать bindkey '^X/' _bash_complete-word в Вашем ~/.zshrc, и нажмите Ctrl+X / для завершения имени файла в любом контексте (Вы, возможно, должны были бы временно вставить пробел перед именем файла, если имени файла предшествует пунктуация, которая не является разделителем слов в оболочке).

12
30.04.2012, 17:56
4 ответа

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

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

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

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

7
27.01.2020, 19:55

-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.
8
27.01.2020, 19:55
  • 1
    Спасибо за Ваш ответ. Однако как @jw013 упомянутый в его комментарии, find условиями является логически AND'd по умолчанию. Таким образом, я просто добавил еще один size условие и это хорошо работали! Заключительная команда похожа: find . -maxdepth 1 -size +358c -size -395c -delete –  Eugene S 30.04.2012, 18:15

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

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

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

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

rm *(L+385-391)

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

7
27.01.2020, 19:55

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

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *
1
27.01.2020, 19:55
  • 1
    Спасибо за ответ! Эта часть кода должна быть введена как одна строка? –  Eugene S 30.04.2012, 18:13
  • 2
    @EugeneS: Да. Это должно работать, вставляя его в Вашей командной строке как есть или присоединяющийся ко всем строкам в одну. –  Birei 30.04.2012, 18:16

Теги

Похожие вопросы