użycie * w wyszukiwaniu plików

9

podczas czytania o wyszukiwaniu plików linuxa otrzymałem następujące ...

Aby wyszukać pliki przy użyciu symbolu wieloznacznego *, zamień nieznany ciąg na *, np. Jeśli pamiętasz tylko, że rozszerzenie to .out, wpisz ls * .out

a kiedy próbowałem następujące polecenie w systemie (ubuntu 14.04 LTS) .. mam

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

w pierwszym przypadku pokazuje brak takiego katalogu ( *.bash*), aw następnym przypadku pokazuje pliki ( .bash*)

Jestem nowy w tym smaku i zgodnie z moimi klasami teorii automatów (*) oznacza dowolną kombinację ciągów znaków, w tym epsilon (pusty) ,, Więc dlaczego wyniki są różne w obu przypadkach ...?

Lazarus
źródło

Odpowiedzi:

11

Kiedy robisz jest rozszerzony zanim zostanie przekazany do . To znaczy, jeśli mamy trzy pliki ( , i ) w katalogu jest uruchomiony .ls **lsabcls *ls a b c

Gdy Bash nie może się rozwinąć, przechodzi przez nieprzetworzony ciąg znaków¹. Dlatego widzisz symbole wieloznaczne w błędzie, wraz z nieodnalezionym komunikatem. lspróbował wyświetlić listę pliku dosłownie o nazwie *.bash*.

Dlaczego więc się nie rozszerzyło? Cóż, domyślnie globbing (jak to rozszerzenie to symbol wieloznaczny) nie zwróci ukrytych plików. Możesz to zmienić za pomocą shopt -s dotglob(to nie będzie trwało, dopóki nie włożysz go do swojego .bashrc- może być domyślnie wyłączone z dobrego powodu, więc bądź ostrożny), oto krótka prezentacja:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Wyjątkiem jest - jak już pokazałeś - kiedy już wyraźnie oświadczyłeś, że pliki zostaną ukryte za pomocą takiego wzoru .bash*. Po prostu zastępuje dotglobustawienie domyślne :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

W każdym razie poza tym dziwactwem, mam nadzieję, że to pomoże ci zrozumieć, co dzieje się pod powierzchnią.


Istnieją inne shoptflagi, które zmieniają sposób globbing prace: extglob, failglob, globstar, nocaseglobi nullglob. Oni i tratwa innych shoptflag są udokumentowane jako część podręcznika Bash .

Podobnie strona o dopasowaniu wzorców powinna być dobra do czytania.

¹ Chyba że failgloblub nullglobsą ustawione.

Oli
źródło
thanx @Oli ,, Nie dostałem tego wszystkiego, jak wspomniałem, jestem nowy w tym smaku ,, ale dostałem 80% tego ... Pomogło mi
Lazarus