Есть ли способ заставить ls показать все точечные файлы, включая скрытые каталоги, сначала обычные каталоги, затем обычные файлы? Я прочитал всю страницу руководства ls, но ничего не нашел. Я также искал Super user и, хотя есть некоторые ответы на различные вопросы, такие как сначала показ скрытых файлов или сначала каталогов, я ничего не нашел в этом порядке. Спасибо
2 ответа
Я собираюсь ответить на свой вопрос. После дополнительных исследований я нашел способ получить то, что я хочу.
Хотя это и не тот порядок, в котором я изначально хотел указать этот вопрос, я нашел способ сделать это с помощью следующего порядка: все каталоги, включая скрытые, затем все точечные файлы, а затем все обычные файлы. С этим в .bashrc: псевдоним d = 'LC_COLLATE = C ls -la --group-directoryies-first'. И я доволен этим.
Самый простой ответ - разделить его на две команды: это лучше всего сделать в скрипте (например, lssort
), но если вы хотите, чтобы ls
всегда работал таким образом, вы можете использовать alias ls=lssort
: -
ls -d --group-directories-first "$@"/.*
ls -d --group-directories-first "$@"/*
Предполагается, что задано одно имя каталога (которое может содержать пробелы) и что это последний переданный параметр. К сожалению, это имеет два ограничения:
- Нужно указать каталог: чтобы преодолеть это, вам нужно отсканировать параметры, чтобы найти последние и сделать разные вызовы, если последний параметр является опцией или не существует (заменить
/
пробелом в приведенных выше вызовах). - Если параметры
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
дважды анализировал командную строку:${$#}
выдает ошибку.