Сортировка папок в Unix, начиная со второго символа

Сортировка папок в Unix, начиная со второго символа

Я пытаюсь отсортировать список каталогов, начиная со второго символа.

Например, если я выполню приведенный ниже код, список каталогов будет отсортирован по первому символу.

$ 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печатает свои аргументы raw на 1 Cстолбце
  • *(qualifiers): glob с квалификаторами glob
  • N: Nullglob: расширяется до нуля, если совпадений нет
  • /: выбрать только файлы типакаталог
  • oe[expression]: oупорядочить список на основе результата выражения e(значения, $REPLYизначально содержащего имя файла, после того, как оно было обработано выражением)
  • REPLY=${REPLY#?}: удалить первый символ из имени файла.

Вы также можете добавить первый символ в конец, например, REPLY=${REPLY#?}.$REPLY[1]так, чтобы asmith, bsmith, csmithсортировать в этом порядке, а не случайным образом.

Связанный контент