Dlaczego ten symbol wieloznaczny nie działa w oczekiwany sposób?

11

Na moim folderze użytkownika, jak mam foldery D ropbox, D ocuments, D ownloads & d UMP.

ls a*powinien wyświetlić listę wszystkich plików, których nazwa zaczyna się od a. Dobrze? Ale kiedy wydaje polecenie ls d*, zamiast po prostu wyświetlać dump, pokazuje mi katalog ls zrzutu. A kiedy podam komendę as ls D*, wyświetla ona ls wszystkich foldów zaczynających się na D

Więc jakiej części mi brakowało w zrozumieniu?

Edycja: dołączanie zrzutu ekranu Zrzut ekranu ls

Popiół
źródło

Odpowiedzi:

17

Według strony podręcznika bash:

bash skanuje każde słowo w poszukiwaniu znaków *,? i [. Jeśli pojawi się jeden z tych znaków, to słowo jest traktowane jako wzór i zastępowane alfabetycznie uporządkowaną listą nazw plików pasujących do wzorca

i z węzła informacyjnego dla ls

Program `ls 'wyświetla informacje o plikach (dowolnego typu, w tym katalogach). Opcje i argumenty pliku można jak zwykle mieszać dowolnie.

W przypadku nieopcyjnych argumentów wiersza polecenia, które są katalogami, domyślnie „ls” wyświetla zawartość katalogów, nie rekurencyjnie, i pomija pliki o nazwach rozpoczynających się od „.”. W przypadku innych argumentów, które nie są opcjami, domyślnie `ls 'wyświetla tylko nazwę pliku. Jeśli nie podano żadnych argumentów nie będących opcjami, „ls” wyświetla zawartość bieżącego katalogu.

więc kiedy dajesz ls d*, d * jest rozwijane do posortowanej listy wszystkich nazw plików / katalogów zaczynających się na d. Więc rozkaz staje się

ls dump

a ponieważ zrzut jest nazwą katalogu, więc otrzymujesz listę wszystkich plików w katalogu „zrzut”, ale kiedy dajesz ls D*, D * jest rozwijane do „ Dropbox Dokumentów do pobrania ”, więc polecenie staje się

ls Desktop Documents Downloads Dropbox

a ponieważ wszystkie są katalogami, otrzymujesz listę plików w indywidualnym katalogu. Gdyby w bieżącym katalogu znajdował się plik rozpoczynający się na literę D , byłby wymieniony osobno.

binW
źródło
2
Drobne uzupełnienie: gdy jako argument podano więcej niż jeden katalog, ls wyświetla nazwę każdego katalogu przed wyświetleniem jego zawartości. Nie zrobi tego dla pojedynczego katalogu.
Marcel Stimberg,
Dzięki! To rozwiało moje wątpliwości. Zrobiłem ls p*i pojawił się plik, ponieważ istnieje i A ls P*pokazuje Pictures ogólnodostępnych Folder jak nie ma pliku zaczynając P . A kiedy utworzyłem katalog o nazwie poo , pojawił się onls p*
Ashfame
7

Zarówno d *, jak i D * wyświetlają listę plików i folderów pasujących odpowiednio do d * i D *, zachowanie jest takie samo, musiał być błąd w teście.

Jeśli chcesz wyświetlić tylko nazwy folderów, a nie zawartość folderu, musisz użyć „-d”:

ls -d D*
João Pinto
źródło
Załączam
0

Jak zasugerowano powyżej, -dopcja jest już dostępna. Dodawanie

alias ld='ls -d'

do mojego ~/.bashrcpliku działa dobrze dla mnie.

użytkownik3179473
źródło
3
Za pomocą tego aliasu blokujesz łatwy dostęp ld - The GNU linker, co uniemożliwi OP kompilowanie i łączenie programów. Użyj alias lsd='ls -d'zamiast tego. Przed aliasingiem czegoś, jak foozawsze, type foosprawdź, czy foojest już używany jako nazwa czegoś i zdecyduj, czy wygoda aliasu zastępuje utratę dostępu do poprzedniejfoo
waltinator