ls: Отображать имя каталога, когда только один соответствует шаблону

Вам нужно заключить переменную в кавычки

testpath="/path/to/first dir/dir/" && printf '%q' "$testpath"
4
07.03.2020, 04:06
3 ответа

Используя ваши примеры, когда вы выполняете ls b*, оболочка расширяет b*до bar barbados, так что вы фактически запускаете ls bar barbados. Когда lsимеет несколько аргументов, если какой-либо из них является каталогом, он печатает имя, за которым следует список файлов в каталоге.

Когда вы выполняете ls f*, оболочка расширяет f*до foo, так что вы фактически запускаете ls foo. Когда lsимеет один аргумент, если этот аргумент является каталогом, печатает список файлов в каталоге (без имени каталога ).

Не существует того, что я бы назвал "хорошим" способом заставить lsделать то, что вы хотите (по крайней мере, я не знаю, кто-то другой может знать лучше ). Одним из «не очень хороших» способов было бы включить дополнительный аргумент, который, как вы знаете, никогда не будет существовать, а затем отфильтровать вывод ошибок, связанных с этим несуществующим файлом. Я отмечу для протокола, что синтаксический анализ вывода ls— плохая идея, но я дам вам это, если это поможет:

$ function dls() {
    if [[ $# -eq 0 ]]; then
        ls
    else
        ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
    fi
}

$ dls
foo

$ dls f*
foo:
1  2

Подобные действия могут иметь непредвиденные последствия (например, вы не сможете перенаправлять стандартные сообщения об ошибках, как обычно ).

2
28.04.2021, 23:21

Используйте параметр -al, который большинство людей использует каждый раз. lsне будет этого делать, пока вы не добавите косую черту в конце имени каталога. Другой параметр -d, тогда он никак не упадет.

Если вы хотите, чтобы он был постоянным, поместите следующее в свой .bashrcв вашем домашнем каталоге:

alias lsd='ls -d' ;

Вы можете использовать команду lsdв будущем.

0
28.04.2021, 23:21

Возможным обходным решением может быть функция-оболочка:

dls() {
    if [ "$#" -eq 1 ] && [ -d "$1" ]; then
        printf '%s:\n' "$1"
    fi
    ls -- "$@"
}
  • Вышеупомянутая функция не принимает какие-либо параметры для передачи в качестве аргументов
  • Он просто проверяет, :
    1. есть только один аргумент
    2. аргумент является каталогом

Если эти два условия верны, выведите имя каталога перед перечислением его содержимого.


% dls f*
foo:
1   2

В некоторых реализациях printfвы можете заменить %sна %q, чтобы имя каталога заключалось в кавычки аналогично тому, как это делают последние версии GNU ls, когда оно содержит пробелы или другие специальные символы.

4
28.04.2021, 23:21

Теги

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