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


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.