Wyklucz jeden katalog we wzorcu zgodnym z `ls`

13

Próbuję lskatalogów, które zawierają .pngpliki (nie ma potrzeby rekurencyjności, choć byłoby to bardzo przydatne), z wyjątkiem jednego. Wyklucz jeden katalog, tj

ls */*.png

działa w porządku.

ls (^one)*/*.png

nie zwraca stdout. Jak to osiągnąć?

Jestem ślepy i podchodzę do niego espeak, więc na razie słyszę tylko standardowe wyjście.

Tomas Jankus
źródło
Jakiej powłoki używasz? Twój wzór wygląda jak wzór zsh, choć nie jest użyteczny, ponieważ nie wykluczałby one(byłby właściwy wzór ^one/*.png), drukowałby wszystko.
Gilles 'SO - przestań być zły'

Odpowiedzi:

16

Opcja 1 - używając tylko ls:
Przy włączonym rozszerzonym globowaniu bash ( shopt -s extglob) możesz:

ls !(one*)/*.png


Opcja 2 - łączenie lsi grep:

Możesz łączyć lszgrep -v

  • na przykład ls */*.png | grep -v "one/"


Opcja 3 - (najlepsze IMO), ale findnie wykorzystuje ls:

Do rekurencyjnego przeszukiwania wszystkich podkatalogów za pomocą find

find . -type f -name "*.png" -not -path "*/one/*"


Wszystkie powyższe jednowierszowe będą wyświetlać katalogi z .pngplikami, jednocześnie odfiltrowując pasujące ścieżki one/; tylko opcja 3 zrobi to rekurencyjnie.

toksefa
źródło
Czy findpolecenie nie musi powiedzieć -path "*/one/*"lub -path "./one/*"?
G-Man mówi „Przywróć Monikę”
@ G-Man Masz absolutną rację. Edytowane powyżej.
toksefa
Czy to by nie pasowało ./phone/handset.png?
G-Man mówi „Reinstate Monica”
@ G-Man Co jest złego w dopasowywaniu .pngsw katalogu o nazwie phone? Myślałem, że tylko próbujemy wykluczyć one?
toksefa
1
Cóż, ponieważ używasz go w połączeniu z -not, oznacza to, że powoduje findwykluczenie plików w katalogu o nazwie phone.
G-Man mówi „Reinstate Monica”
6

W Zsh , setopt extended_globwpisz ~/.zshrc. Następnie możesz użyć wzoru wieloznacznego, ^one aby wykluczyć nazwany katalog one.

ls ^one/*.png

Jeśli chcesz rekursować w podkatalogach, użyj **/do rekurencyjnego globowania. Aby wykluczyć katalog wywoływany onena najwyższym poziomie, a także katalog najwyższego poziomu:

ls ^one/**/*.png

Aby wykluczyć pliki z nazwanego podkatalogu one, ale nie pliki z jego podkatalogów:

ls **/^one/*.png

Aby wykluczyć pliki z podkatalogu wywoływanego onena dowolnym poziomie, użyj wzoru powtarzania z #operatorem wokół negacji:

ls (^one/)#/*.png
Gilles „SO- przestań być zły”
źródło