Сортировка папок в Терминале в алфавитном порядке

Чтобы найти файлы в домашнем каталоге (только ), которые содержат хотя бы один пробел:

find "$HOME" -maxdepth 1 -type f -name '*[ ]*'

... которые содержат хотя бы один*:

find "$HOME" -maxdepth 1 -type f -name '*[*]*'

... которые содержат как минимум [или]:

find "$HOME" -maxdepth 1 -type f -name '*[\[\]]*'

... которые содержат один из перечисленных выше:

find "$HOME" -maxdepth 1 -type f -name '*[ *\[\]]*'

Чтобы удалить эти файлы, добавьте либо -deleteв конец команды, либо -exec rm {} +.


В системах, где findне поддерживает -maxdepth 1, запуск из домашнего каталога:

find. -type d ! -name. -prune -o -type f -name '*[ *\[\]]*' -print
1
19.02.2020, 22:58
3 ответа

Они расположены в алфавитном порядке. В алфавитном порядке 2идет после 10, потому что 2идет после 1, так же как Bидет после AB. Здесь вам нужен числовой порядок вместо алфавитного порядка.

Для этого убедитесь, что вы используете оболочку zsh(, которая должна быть пользовательской оболочкой по умолчанию в последней версии macos ), и используйте:

for d in *(N/n); do (cd -- $d && print -r -- $d && ls); done

Или в сокращенной форме:

for d (*(N/n)) (cd -- $d && print -r -- $d && ls)

Часть (N/n)— это квалификаторы glob:

  • N:заменяется ничем, если совпадений нет, вместо сообщения об ошибке(nullglobопция включена для этого одного шара ).
  • /:выбирает только файлы типа директория
  • n:включает числовую сортировку для расширения глобуса (numericglobsort, включенную для этого одного глобуса ).

Вы также можете включить numericglobsortна глобальном уровне (set -o numericglobsort), если обнаружите, что обычно предпочитаете этот порядок, и тогда вы можете вернуться к использованию своего for d in */;....

Обратите внимание, что *(/)не совсем то же самое, что */. *(/)расширяется до всех файлов типа каталога , а */выбирает файлы типа каталога или символической ссылки на каталог и добавляет /, поэтому */больше похоже на*(-/M)(квалификатор -glob заставляет последующие квалификаторы применять после разрешения символической ссылки, а Mдолжен помечать файлы типа каталога (здесь после разрешения символической ссылки )с/).

1
28.04.2021, 23:22

Если вы хотите сохранить простой подход и папки, вы можете разделить их по количеству цифр:

for d in ?/;  do echo "$d"; (cd "$d" && ls); done
for d in ??/; do echo "$d"; (cd "$d" && ls); done

Такое дублирование кода, конечно, не очень приятно. Но опять же, вы вообще не даете контекста, кроме «вы должны #1 #2 #3».

А может быть:

for d in {1..20}; do echo "$d"; (cd "$d" && ls); done

(также работает с косой чертой после{1..20}/)

Это имеет смысл только в том случае, если у вас есть все номера в виде папок.

1
28.04.2021, 23:22

Вы можете сделать что-то вроде этого:

for d in $(find * -type d | sort -g); do echo "$d";(cd "$d" && ls);done;
0
28.04.2021, 23:22

Теги

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