Odpowiedzi:
Co powiesz na:
ls *[!0-9][0-9].txt
!
Na początku grupy uzupełnia swoje znaczenie.
Jak zauważono w komentarzach, robi to bash, spróbuj np .:
printf "%s\n" *[!0-9][0-9].txt
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:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
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ło Atxt
. 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 . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
obsługuje kilka różnych smaków wyrażeń regularnych. Możesz określić -regextype
na przykład:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
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.
Z rozszerzonymi globami ksh (lub bash -O extglob
lub zsh -o kshglob
), których już używasz, byłyby to:
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
Lub
ls -d -- !(*[[:digit:]])[[:digit:]].txt
Jeśli chcesz dopasować na a1.txt
a2.txt
, ale nie a12.txt
ani 12.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łownie ls
, 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 w zsh
lub ustaw FIGNORE
się !(.|..)
w ksh93
.
shopt -s extglob
.