2012-09-28 9 views
11

Possible Duplicate:
How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?Lista wszystkich plików, które nie pasują do wyboru (za pomocą ls)

Czytałem stronę man dla ls, i nie mogę znaleźć opcji, aby wyświetlić wszystkie tamto nie pasuje do selektora plików . Czy wiesz, jak wykonać tę operację?

Na przykład: powiedzmy mój katalog jest taka:

> ls 
a.txt b.mkv c.txt d.mp3 e.flv 

Teraz chciałbym zrobić coś, co robi następujących

> ls -[SOME_OPTION] *.txt 
b.mkv d.mp3 e.flv 

Czy istnieje taka możliwość?

Jeśli nie, czy istnieje sposób, aby potokować wyjście ls do innej funkcji (prawdopodobnie sed), która pokazuje tylko te, które chciałbym?

Nie wiem dokładnie, jak to zrobić, ale ja sobie wyobrazić, że będzie coś takiego:

> ls | sed [SOMETHING] 

naprawdę powinien nauczyć się korzystać sed, awk i grep, ale zachować utknięcie w zrozumieniu, jak pisać wyrażenia. Rozumiem wyraźnie pojęcie wyrażeń regularnych, ale mylę się z wyrażeniami regularnymi, które używają innej składni.

Każda pomoc będzie bardzo ceniona!

EDIT:

Zapomniałam wspomnieć, że jestem z systemem Mac OS X, a więc funkcje mogą się nieznacznie różnić od tych opisanych w innych odpowiedzi na/Linux powłoce UNIX (stąd niektóre z moich pomyłki z sed, awk i grep).

Odpowiedz

16

może to polecenie pomoże Ci

find ./ -maxdepth 1 ! -path "*txt" 
+0

To ładnie działa z wieloma różnymi selektorami jako parametrem 'path' Dziękuję! Jedną z rzeczy, którą znalazłem, było to, że mogłem zrobić 'find. -maxdepth 1! -path" * txt "' too. Co teraz powinienem użyć, gdybym miał Regex do filtrowania listy? –

+0

if chcesz użyć Regex, użyj grep, np. masz 3 pliki takie jak "abc", użyj ls | grep -v "[a | b]", wtedy wyświetli c. a następnie jeśli masz 3 pliki aa aaa, użyj "ls | grep -v "a +", a następnie wyświetli tylko "a". –

+0

./ Argument jest opcjonalny, ponieważ polecenie find już rozpoczyna wyszukiwanie w dół od bieżącego drzewa katalogów – kante

9
ls|grep -v ".txt" 

to pomaga?

+0

To działa dla przypadku, który ci dałem, ale naprawdę szukam czegoś, co działa z dowolnymi selektorami. Na przykład, jeśli nie chcę pokazywać tych, które miały znak 'x', po którym następuje słowo' w ', potrzebuję użyć selektora '* x * in *'. Nie byłoby to możliwe na twoim przykładzie, jak sądzę. –

+0

@KaushikShankar Myślę, że to zadziała. Spróbuj. –

3

Jednym ze sposobów, za pomocą find:

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n" 
+0

Dziękuję za odpowiedź! Niestety, myślę, że może być problem z systemem Mac OS X. Błąd pojawia się następująco: Command: '> znaleźć. -maxdepth 1-type f -not -name "* .txt" -printf "% f \ n" ' Błąd: ' 39m \ n "znajdź: -printf: nieznany główny lub operator' –

+0

@KaushikShankar: Tak, zignoruj printf instrukcja, to tylko uporządkuje twój ouput, aby dostarczyć listę plików podobnych do tego, jak działa 'ls' .Bi znalezisko' BSD find' tego nie rozumie. – Steve

3

ls prostu wymienia argumenty co jest przedstawiane z. *.txt zostaje rozwinięty do a.txt c.txt przed ls widzi to, spróbuj echo *.txt.

Aby zrobić to, czego poprosić o sed można usunąć wzór z wejścia, na przykład:

ls | sed '/\.txt$/d' 

Czy usunąć wszystkie linie kończące się .txt.

Z bash i zsh można mieć powłoki zrobić odwróconą ekspansję, z bash byłoby:

ls !(*.txt) 

zsh:

ls *~*.txt 

Zauważ, że oba pociski potrzebne Rozszerzona opcja globalna została włączona, shopt -s extglob z bash i setopt extendedglob z zsh.

+1

Dzięki za pokazanie mi innej funkcji zsh! To jest zajebiste. –

34

może to być pomóc

ls --ignore = *. Txt

Nie będzie wyświetlać pliki .txt w katalogu. to jest dokładna odpowiedź na twoje pytanie.

+1

Ten działał dobrze dla mnie. Możesz napisać - zignoruj ​​przełączniki, a więc zignoruj ​​np. wszystkie pliki txt, wszystkie pliki zaczynające się od aj i wszystkie pliki o nazwie zawierającej 'bar': 'ls --ignore = *. txt --ignore = j * --ignore = * bar *' –

+0

Opcja jest niedozwolona, ​​kiedy użyj tego na El Capitan ls --ignore = * pdf ls: niedozwolona opcja - - użycie: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...] –

+1

Dzięki. Właściwie to powinna być zaakceptowana odpowiedź !! – Veera

Powiązane problemy