Jak mogę wyświetlić listę plików o nazwie kończącej się ostatnim znakiem i .txt
rozszerzeniem?
Próbowałem, ls *+([[:digit:]]).txt
ale dotyczy to abc12.txt
i abc2.txt
.
Ale muszę tylko dostać abc2.txt
. Jak mogę to zrobić?
Czy istnieje jakaś forma :digit:
tego umożliwiająca?
shopt -s extglob
.Odpowiedzi:
Co powiesz na:
!
Na początku grupy uzupełnia swoje znaczenie.Jak zauważono w komentarzach, robi to bash, spróbuj np .:
źródło
ls
) Nie obsługuje tutaj wyrażeń regularnych. Są to wyrażenia nazw plików (Globbing) . Różnicę widać już w przykładzie: tutaj*
znajduje się symbol wieloznaczny, którego nie ma w wyrażeniach regularnych, w których można by.*
to osiągnąć. Wyrażenia regularne są o wiele potężniejsze niż globowanie.Pytanie zadane dla wyrażeń regularnych. Bash
ls
nie obsługuje tutaj wyrażeń regularnych. Obsługuje wyrażenia nazw plików ( Globbing ), formę symboli wieloznacznych. Wyrażenia regularne są o wiele potężniejsze.Jeśli naprawdę chcesz używać wyrażeń regularnych, możesz użyć
find -regex
tego w następujący sposób:Znajdź jest domyślnie rekurencyjne, ale
ls
nie jest. Aby znaleźć tylko pliki w bieżącym katalogu, możesz wyłączyć rekursję za pomocą-maxdepth 1
. Znajdź dopasowania do nazwy pliku ze ścieżką, dlatego nazwy plików zaczynają się,./
jeśli uruchomisz find.
. Wyrażenie regularne zaczyna się\./
od poradzenia sobie z tym. Zauważ, że w wyrażeniu regularnym.
jest to znak specjalny pasujący do dowolnej postaci, ale tutaj naprawdę chcemy kropki, dlatego uciekamy od niej odwrotnym ukośnikiem. Robimy to samo dla kropki.txt
, ponieważ w przeciwnym razie wyrażenie regularne również by pasowałoAtxt
. Klasy cyfr są takie same jak dla globowania, tyle, że trzeba^
zamiast!
odwrócić klasę znaków.Jeśli chcesz uzyskać wynik
ls
, możesz użyć w-exec ls
następujący sposób:find
obsługuje kilka różnych smaków wyrażeń regularnych. Możesz określić-regextype
na przykład:Dla mnie możliwe są następujące typy: „findutils-default”, „awk”, „egrep”, „ed”, „emacs”, „gnu-awk”, „grep”, „posix-awk”, „posix-basic” , „posix-egrep”, „posix-Extended”, „posix-minimal-basic”, „sed” Możesz uruchomić,
find -regextype help
aby dowiedzieć się, co jest obsługiwane w twoim systemie.źródło
Z rozszerzonymi globami ksh (lub
bash -O extglob
lubzsh -o kshglob
), których już używasz, byłyby to:Lub
Jeśli chcesz dopasować na
a1.txt
a2.txt
, ale niea12.txt
ani12.txt
.Pamiętaj jednak, że w ksh i bash (chyba że ustawisz
failglob
opcję uzyskania zachowania podobnego do zachowania zsh), jeśli ten wzorzec nie pasuje do żadnego pliku, wzorzec zostanie przekazany dosłowniels
, a jeśli ten (dziwnie nazwany) plik zdarzy się istnieje, zostanie wyświetlony na liście,ls
nawet jeśli nie pasuje do samego wzorca.Aby włączyć
.2.txt
, należy ustawićdotglob
opcjębash
, dodać(D)
kwalifikator glob wzsh
lub ustawFIGNORE
się!(.|..)
wksh93
.źródło