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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.