1

Есть ли способ заставить ls показать все точечные файлы, включая скрытые каталоги, сначала обычные каталоги, затем обычные файлы? Я прочитал всю страницу руководства ls, но ничего не нашел. Я также искал Super user и, хотя есть некоторые ответы на различные вопросы, такие как сначала показ скрытых файлов или сначала каталогов, я ничего не нашел в этом порядке. Спасибо

2 ответа2

0

Я собираюсь ответить на свой вопрос. После дополнительных исследований я нашел способ получить то, что я хочу.

Хотя это и не тот порядок, в котором я изначально хотел указать этот вопрос, я нашел способ сделать это с помощью следующего порядка: все каталоги, включая скрытые, затем все точечные файлы, а затем все обычные файлы. С этим в .bashrc: псевдоним d = 'LC_COLLATE = C ls -la --group-directoryies-first'. И я доволен этим.

0

Самый простой ответ - разделить его на две команды: это лучше всего сделать в скрипте (например, lssort), но если вы хотите, чтобы ls всегда работал таким образом, вы можете использовать alias ls=lssort: -

ls -d --group-directories-first "$@"/.*
ls -d --group-directories-first "$@"/*

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

  1. Нужно указать каталог: чтобы преодолеть это, вам нужно отсканировать параметры, чтобы найти последние и сделать разные вызовы, если последний параметр является опцией или не существует (заменить / пробелом в приведенных выше вызовах).
  2. Если параметры ls приводят к выводу итоговой строки (например, -l), вы получите два итога, по одному на каждый вызов.

На первый из них отвечает сценарий:

[ $# == 0 ] && lp='' || eval lp="\${$#}"
[ "${lp#-}" == "$lp" ] && sl=/ || sl=' '
ls -d --group-directories-first "$@"$sl.*
ls -d --group-directories-first "$@"$sl*

Второй требует, чтобы все файлы были перечислены в одной команде, а вывод перенаправлен во временный файл с последовательностью поиска grep , сначала для ^total [0-9]*$ , затем для файлов, начинающихся с . , затем тот же поиск с -v чтобы перечислить остаток. Это легко, если ls создает пустые имена файлов, но гораздо сложнее в общем случае, выходящем за рамки этого ответа.

Заметки:-

  • ls -d необходим, чтобы избежать расширения подкаталогов.
  • ... && ... || ... это более компактная форма if ...; then ...; else ...; fi .
  • eval был необходим, чтобы bash дважды анализировал командную строку: ${$#} выдает ошибку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .