ls
Może dać efekt podobny
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
Ale rzeczywiście mam nadzieję, że po prostu dowiedzieć się CentOS-Base.repo
, CentOS-Debuginfo.repo
a CentOS-Vault.repo
jednak nie CentOS-Media.repo
. Więc uruchamiam to polecenie
ls [^\(Media\)]
Ale dostaję informację o błędzie. Jak mam to zrobić?
Odpowiedzi:
W najprostszym przypadku możesz użyć następujących (w przypadku, gdy 1. podtekst jest statyczny
CentOS
):[BDV]
- klasa znaków zapewniająca, że drugie pod-słowo zaczyna się od jednego z określonych znakówlub to samo z negacją :
Jeśli chcesz zignorować wszystkie nazwy plików zawierające
M
znak, z implementacją GNUls
(jak zwykle w CentOS), użyj opcji-I
(--ignore
):Aby zignorować wpisy ze
Media
słowem:Wzorce te należy przekazywać dosłownie
ls
, więc należy je zacytować (w przeciwnym razie powłoka traktowałaby je jako globusy do rozszerzenia).źródło
ls *[^M]*
?ls CentOS-[^M]*
Praca, alels *[^M]*
nie ..M
pojawienie się znaku LUBMedia
słowo?M
.Kilka powłok ma operatory globowania negacji:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:źródło
Jedną z opcji jest użycie
find
z-not -name
flagami. Tjfind . -not -name CentOS-Media.repo
. Jeśli nie chcesz ponownie zapisywać struktury katalogów, dodaj-maxdepth 1
flagę.Alternatywnie można napisać następujące (co jest znacznie bardziej skomplikowane, ale zapomniałem o
-not
fladze i opublikowałem tę odpowiedź pierwotnie, więc nie usunę tej części):find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'
Musisz wymusić
find
oddzielenie nazw plików bajtem zerowym, aby nowe wiersze w nazwach plików niczego nie rozkładały. Mam nadzieję, żegrep
obsługuje tego rodzaju separator z flagą-z
. Możesz powrócić do typowej separacji (tj. Bajt zerowy -> nowa linia) za pomocątr '\0' '\n'
źródło
printf '%s\0' *
którymi nie będą się powtarzać i domyślnie nie zawierają plików dot (domyślnie niektóre powłoki mają taką opcję). Także nie trzeba-E
do tego wyrażenia regularnego, ale do czegoś trzeba albo interpretacja odwrotnego ukośnika.
lub umieścić go w[]
, a ty zależą GNU znaleźć i grep.Najłatwiej jest użyć find. Robić:
Tutaj „f” oznacza wyszukiwanie tylko zwykłych plików (wyklucza jednak dowiązania symboliczne do zwykłych plików; w GNU
find
użyj-xtype f
zamiast tego, aby je dołączyć). Jeśli chcesz wyszukać katalogi, podaj zamiast niego „d”.(
-maxdepth
początkowo rozszerzenie GNU jest teraz dość powszechne. Jeślifind
nie obsługujesz go, możesz zastąpić-maxdepth 1
go standardem! -name . -prune
).zobacz stronę podręcznika użytkownika find, aby uzyskać więcej niesamowitych funkcji.
źródło