![Сортировка папок в Unix, начиная со второго символа](https://rvso.com/image/168780/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BF%D0%B0%D0%BF%D0%BE%D0%BA%20%D0%B2%20Unix%2C%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8F%20%D1%81%D0%BE%20%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%B3%D0%BE%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0.png)
Я пытаюсь отсортировать список каталогов, начиная со второго символа.
Например, если я выполню приведенный ниже код, список каталогов будет отсортирован по первому символу.
$ ls -1d */
lrodriguez/
mreynolds/
yalberto/
Я хочу отобразить их как:
yalberto/
mreynolds/
lrodriguez/
Я просмотрел следующий форум: Как сортировать файлы по части имени файла? но успеха не имел.
Я пробовал что-то вроде: ls -1d -- *?[a-z]* | sort -t?[a-z] -k2
но не получил никаких результатов. Довольно новичок в среде Unix, и любые указания будут очень полезны. Заранее спасибо.
решение1
С помощью sort
можно использовать клавишу формы F.C
для указания позиции символав пределахполе. Так, например,
$ printf '%s\n' */ | sort -k1.2
yalberto/
mreynolds/
lrodriguez/
Обратите внимание, что этот метод не сработает, если какое-либо имя каталога содержит символ новой строки.
Эту проблему можно решить с помощью GNU, sort
работая с записями, разделенными NUL, следующим образом:
printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'
Также обратите внимание, что расширение */
также включает символические ссылки на каталоги.
решение2
С zsh
:
print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
print -rC1
печатает свои аргументыr
aw на1
C
столбце*(qualifiers)
: glob с квалификаторами globN
:N
ullglob: расширяется до нуля, если совпадений нет/
: выбрать только файлы типакаталогoe[expression]
:o
упорядочить список на основе результата выраженияe
(значения,$REPLY
изначально содержащего имя файла, после того, как оно было обработано выражением)REPLY=${REPLY#?}
: удалить первый символ из имени файла.
Вы также можете добавить первый символ в конец, например, REPLY=${REPLY#?}.$REPLY[1]
так, чтобы asmith
, bsmith
, csmith
сортировать в этом порядке, а не случайным образом.