Почему этот шаблон не работает так, как я ожидаю?

11

В моей пользовательской папке у меня есть папки, такие как D ropbox, D docments, D ownloads & d ump.

ls a*должен перечислить все файлы, чье имя начинается с a. Правильно? Но когда я даю команду ls d*, вместо того, чтобы просто отобразить dumpее, я показываю каталог ls дампа. И когда я ls D*даю команду as , то она отображает ls всех фолдов, начиная с D

Так какую часть я упустил, чтобы понять это?

Редактировать: прикрепление скриншота скриншот ls

Ashfame
источник

Ответы:

17

Согласно странице руководства bash:

bash сканирует каждое слово на наличие символов *,? и [. Если появляется один из этих символов, слово считается шаблоном и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону.

и из информационного узла для ls

Программа `ls 'выводит информацию о файлах (любого типа, включая каталоги). Опции и аргументы файла могут быть произвольно перемешаны, как обычно.

Для неопционных аргументов командной строки, которые являются каталогами, по умолчанию «ls» перечисляет содержимое каталогов, не рекурсивно, и пропускает файлы с именами, начинающимися с «.». Для других аргументов, не являющихся опциями, по умолчанию `ls 'отображает только имя файла. Если аргументы без опций не указаны, 'ls' выводит содержимое текущего каталога.

поэтому, когда вы даете ls d*, d * расширяется до отсортированного списка всех имен файлов / каталогов, начинающихся с d. Таким образом, ваша команда становится

ls dump

и поскольку dump является именем каталога, вы получаете список всех файлов в каталоге «dump», но когда вы даете ls D*, D * расширяется до « Dropbox для загрузки документов рабочего стола », поэтому команда становится

ls Desktop Documents Downloads Dropbox

и так как все это каталоги, вы получаете список файлов в отдельном каталоге. Если бы в текущем каталоге был файл, начинающийся с D, он был бы указан отдельно.

binW
источник
2
Незначительное добавление: если в качестве аргумента указано более одного каталога, ls отображает имя каждого каталога перед перечислением его содержимого. Это не будет делать это для одного каталога.
Марсель Стимберг
Благодарность! Это очистило мои сомнения. Я сделал , ls p*и он появился файл , поскольку он существует и еще ls P*показывает Pictures Публичной папки , поскольку нет ни одного файла , начиная с P . И когда я создал каталог с именем poo , он появился наls p*
Ashfame
7

Если d * и D * отображают список файлов и папок, соответствующих d * и D *, соответственно, поведение такое же, в вашем тесте должна быть ошибка.

Если вы хотите перечислить только имена папок, а не содержимое папки, вам нужно использовать «-d»:

ls -d D*
Жоау Пинту
источник
Я приложил скриншот, пожалуйста, посмотрите
Ashfame
0

Как предложено выше, -dвариант это путь. Добавление

alias ld='ls -d'

в моем ~/.bashrcфайле хорошо работает для меня.

user3179473
источник
3
С помощью этого псевдонима вы блокируете легкий доступ ld - The GNU linker, что не позволяет OP компилировать и связывать программы. Используйте alias lsd='ls -d'вместо этого. Перед тем как наложить псевдоним, как fooвсегда, type fooпосмотрите, используется ли fooуже как имя для чего-либо, и решите, переопределит ли удобство псевдонима потерю доступа к предыдущемуfoo
waltinator