Чому ця підстановка не працює так, як я очікував?


11

У моїй папці користувача я маю папки типу D ropbox, D okupations, D ownloads & d ump.

ls a*слід перелічити всі файли, з яких починається ім'я a. Правильно? Але коли я даю команду ls d*, замість того, щоб просто показувати, dumpвона показує мені ls dump directory. І коли я даю команду як ls D*, то вона відображає ls всіх складок, починаючи з D

Отже, яку частину я пропустив, щоб зрозуміти це?

Редагування: додавання екрана екрана знімок екрана

Відповіді:


17

Відповідно до сторінки bash man:

bash сканує кожне слово для символів *,? та [. Якщо з’являється один із цих символів, то слово вважається візерунком і замінюється алфавітно відсортованим списком імен файлів, що відповідають шаблону

і з інформаційного вузла для ls

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

Для необов'язкових аргументів командного рядка, що є каталогами, за замовчуванням 'ls' перераховує вміст каталогів, а не рекурсивно та опускаючи файли з іменами, що починаються з '.' Для інших аргументів, які не є параметрами, за замовчуванням `ls 'перераховує лише ім'я файлу. Якщо аргументи необов'язкові не вказані, 'ls' перераховує вміст поточного каталогу.

тож коли ви даєте ls d*, d * розширюється на відсортований список усіх імен файлів / директорій, починаючи з d. Так ти командуєш

ls dump

а як dump - назва каталогів, то ви отримуєте список усіх файлів у каталозі "dump", але коли ви даєте ls D*, D * розширюється на " Dropbox завантаження документів на робочий стіл ", так команда стає

ls Desktop Documents Downloads Dropbox

і оскільки всі це каталоги, ви отримуєте перелік файлів в окремих каталогах. Якби у поточному каталозі був файл, починаючи з D, він був би окремо вказаний.


2
Невелике доповнення: Коли в якості аргументу подано більше одного каталогу, ls відображає ім’я кожного каталогу перед тим, як перерахувати його вміст. Це не зробить це для одного каталогу.
Марсель Стімберг

Спасибі! Це очистило мої сумніви. Я зробив , ls p*і він з'явився файл , оскільки він існує і ще ls P*показує Pictures Публічної папки , оскільки немає ні одного файлу , починаючи з P . І коли я створив каталог з назвою poo , він з’явивсяls p*
Ashfame

7

ls d * і D * обидва списки файлів і папок, що відповідають d * і D * відповідно, поведінка однакова, на вашому тесті повинна бути помилка.

Якщо ви хочете перерахувати лише імена папок, а не вміст папки, вам потрібно використовувати "-d":

ls -d D*

Я додав скріншот, будь ласка, подивіться
Ashfame

0

Як було запропоновано вище, -dваріант - це шлях. Додавання

alias ld='ls -d'

на мій ~/.bashrcфайл добре працює для мене.


3
Завдяки цьому псевдоніму ви блокуєте простий доступ до нього ld - The GNU linker, що не дозволить ОП збирати та зв'язувати програми. Використовуйте alias lsd='ls -d'замість цього. Перед тим, як fooзавжди робити щось , type fooщоб дізнатися, чи fooвоно вже використовується як ім'я для чогось, і вирішіть, чи зручність псевдоніма перекриє втрату доступу до попередньогоfoo
waltinator
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.