Многоразрядные диапазоны файлов в лексикографическом порядке в zsh

Для удаления скрытых файлов необходимо указать:

rm -r images/* images/.*

С оболочками, шарики которых включают . и .., это приведет к ошибке как

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

но это удалит скрытые файлы.

Подход без errormessage должен использовать, находят/удаляют с mindepth. Это - находка гну.

find images -mindepth 1 -delete

Вашей находке может недоставать -mindepth или -delete предикат, в этом случае, Вы могли сделать:

find images/. ! -name . -prune -exec rm -rf {} +
24
19.11.2011, 01:28
2 ответа

[2-57] набор символов, состоящий из 2, 3, 4, 5 и 7, в zsh и любом подстановочном знаке и regexp синтаксисе там. Ваш шаблон шарика *[2-57] соответствует каждому имени файла, последний знак которого является одной из тех пяти цифр.

Я думаю, что Вы - misremembering синтаксис [m,n] спецификатор шарика. Спецификаторы шарика всегда входят в круглые скобки в конце шаблона, и разделитель диапазона является запятой. Шаблон *([2,57]) расширяется до 2-го, 3-го, …, 57-е соответствия. Порядок расширения по умолчанию является лексикографическим (с некоторым специальным волшебством отсортировать числа в числовом порядке, если numeric_glob_sort опция установлена); можно управлять им с o или O спецификатор шарика (например. *(om[2,57]) соответствовать 57 новым файлам кроме одного нового файла).

for x in /foo/bar/*([2,57]); do print $x; done

Не, что Вы попросили, но связали и возможно полезный для будущих читателей: если Вы хотите перечислить файлы 2 - 57, существуют ли они или нет, можно использовать выражение фигурной скобки диапазона. Эта функция также существует в ударе и ksh.

echo hello{2..57}

И если Вы хотите соответствовать файлам, имя которых содержит число между 2 и 57, можно использовать шаблон <2-57>. Это характерно для zsh.

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

Обратите внимание что шаблон как *<2-57> вероятно не сделать то, что Вы ожидаете, потому что * мог соответствовать цифрам также. Например, file58 соответствия *<2-57>, с file5 соответствие * часть и 8 соответствие <2-57> часть. Шаблон *[^0-9]<2-57> избегает этой проблемы.

30
27.01.2020, 19:41
  • 1
    Вы правы. Я был misremembering спецификатор шарика. Спасибо за тщательное объяснение. –  Amelio Vazquez-Reina 25.11.2011, 23:50
  • 2
    Между прочим, этот оператор получил меня немного перепутанный: if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression. Если бы файлы не существуют и нет никаких соответствий, как расширение фигурной скобки знало бы, как расшириться? (как это расширилось бы по-другому по сравнению со спецификатором шарика?) –  Amelio Vazquez-Reina 25.11.2011, 23:52
  • 3
    @intrpc foo{8..11}bar расширяется до foo8bar foo9bar foo10bar foo11bar. Этот бит расширения не связан с именами файлов. Точно так же foo{eight,nine,ten,eleven}bar расширяется до fooeightbar fooninebar footenbar fooelevenbar. Это - расширение фигурной скобки в ksh/bash/zsh. –  Gilles 'SO- stop being evil' 25.11.2011, 23:55

но zsh, по-видимому, думает, что я прошу файлы 2 - 5 (или что-то как этот) вместо файлов 2 - 57. Какие-либо мысли, почему?

Поскольку [] скобки указывают на список подобранных символов (который может быть цифрами), не числа, интерпретируемые математически. Такой шаблон подобран против отдельного символа. Список может содержать диапазоны, но цифр или букв. [2-57] соответствие расширяется до "Всех цифр в диапазоне от 2 до 5 и 7".

Для соответствия числам от 2 до 57 было бы легче использовать выражение последовательности вместо globbing шаблона (или вместе с таким):

for x in /foo/bar/*{2..57}; do print $x; done

Править: Но это, к сожалению, не даст Вам лексикографическое распоряжение всех перечисленных файлов - они были бы сгруппированы общими окончаниями числа, должными окружать расширение.

6
27.01.2020, 19:41
  • 1
    Спасибо @rozcietrzewiacz! Я должен был думать об этом. Мои файлы имели числа в них, поэтому на мгновение я думал [] печатал вещи в порядке.. –  Amelio Vazquez-Reina 19.11.2011, 01:34
  • 2
    Ваше объяснение [2-57] корректно, но я не думаю {2..57} (это - то, что Вы имели в виду, правильно?) относится для того, что intrpc хочет сделать, который является “выбором файлы 2 - 57 в лексикографическом порядке”. –  Gilles 'SO- stop being evil' 19.11.2011, 03:40
  • 3
    Спасибо за редактирование (время для засыпания я предполагаю). И Вы правы - я забыл о лексикографической части порядка. –  rozcietrzewiacz 19.11.2011, 03:48

Теги

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