Jak znaleźć wszystkie pliki oprócz określonego pliku

13

lsMoż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.repoa CentOS-Vault.repojednak nie CentOS-Media.repo. Więc uruchamiam to polecenie

ls [^\(Media\)]

Ale dostaję informację o błędzie. Jak mam to zrobić?

yode
źródło
Powiązane: Wyklucz jeden wzór z
globalnego
@steeldriver Dzięki za link, który jest dla mnie bardzo przydatny ..
yode
Można rozważyć włączenie powłokę na zsh , który ma usuwania wzór siłownia
Basile Starynkevitch

Odpowiedzi:

10

W najprostszym przypadku możesz użyć następujących (w przypadku, gdy 1. podtekst jest statyczny CentOS):

ls CentOS-[BDV]*

  • [BDV] - klasa znaków zapewniająca, że ​​drugie pod-słowo zaczyna się od jednego z określonych znaków

lub to samo z negacją :

ls CentOS-[^M]*

Jeśli chcesz zignorować wszystkie nazwy plików zawierające Mznak, z implementacją GNU ls(jak zwykle w CentOS), użyj opcji -I( --ignore):

ls -I '*M*'

-I, --ignore = WZÓR
nie wyświetla domyślnych wpisów pasujących do WZORCA powłoki

Aby zignorować wpisy ze Mediasłowem:

ls -I '*Media*'

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).

Roman Perekhrest
źródło
Dlaczego nie możemy użyć ls *[^M]*
yod
ls CentOS-[^M]*Praca, ale ls *[^M]*nie ..
yode
@yode, zależy od tego, co dokładnie chcesz zignorować: Mpojawienie się znaku LUB Mediasłowo?
RomanPerekhrest
Ale w moim przypadku tylko ten plik ma charater M.
yode
3
Wzory są zachłanne: pierwsza * pasuje do wszystkiego oprócz ostatniej litery, [^ M] dopasowuje ostatnią literę, ponieważ żaden z nich nie kończy się na M, a końcowy * pasuje do pustego ciągu. Więc wszystkie pasują do siebie. I nawet jeśli coś kończy się na M, to i tak będzie pasować, zakładając, że jest coś innego niż M: np. Jeśli masz plik o nazwie OOM, pierwsza gwiazda będzie pasować do pierwszego O, [^ M] będzie pasować do drugiego O a końcowy początek byłby zgodny z M.
NickD
12

Kilka powłok ma operatory globowania negacji:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    
Stéphane Chazelas
źródło
6

Jedną z opcji jest użycie findz -not -name flagami. Tj find . -not -name CentOS-Media.repo. Jeśli nie chcesz ponownie zapisywać struktury katalogów, dodaj -maxdepth 1flagę.

Alternatywnie można napisać następujące (co jest znacznie bardziej skomplikowane, ale zapomniałem o -notfladze 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ć findoddzielenie nazw plików bajtem zerowym, aby nowe wiersze w nazwach plików niczego nie rozkładały. Mam nadzieję, że grepobsługuje tego rodzaju separator z flagą -z. Możesz powrócić do typowej separacji (tj. Bajt zerowy -> nowa linia) za pomocątr '\0' '\n'

mucha styropianowa
źródło
1
Możesz także uzyskać nazwy plików z separacją zerową, z 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 -Edo 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.
dave_thompson_085
4

Najłatwiej jest użyć find. Robić:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Tutaj „f” oznacza wyszukiwanie tylko zwykłych plików (wyklucza jednak dowiązania symboliczne do zwykłych plików; w GNU findużyj -xtype fzamiast tego, aby je dołączyć). Jeśli chcesz wyszukać katalogi, podaj zamiast niego „d”.

( -maxdepthpoczątkowo rozszerzenie GNU jest teraz dość powszechne. Jeśli findnie obsługujesz go, możesz zastąpić -maxdepth 1go standardem ! -name . -prune).

zobacz stronę podręcznika użytkownika find, aby uzyskać więcej niesamowitych funkcji.

Al 123
źródło