Próbuję ls
katalogów, które zawierają .png
pliki (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.
one
(byłby właściwy wzór^one/*.png
), drukowałby wszystko.Odpowiedzi:
Opcja 1 - używając tylko
ls
:Przy włączonym rozszerzonym globowaniu bash (
shopt -s extglob
) możesz:Opcja 2 - łączenie
ls
igrep
:Możesz łączyć
ls
zgrep -v
ls */*.png | grep -v "one/"
Opcja 3 - (najlepsze IMO), ale
find
nie wykorzystujels
:Do rekurencyjnego przeszukiwania wszystkich podkatalogów za pomocą
find
Wszystkie powyższe jednowierszowe będą wyświetlać katalogi z
.png
plikami, jednocześnie odfiltrowując pasujące ścieżkione/
; tylko opcja 3 zrobi to rekurencyjnie.źródło
find
polecenie nie musi powiedzieć-path "*/one/*"
lub-path "./one/*"
?./phone/handset.png
?.png
sw katalogu o nazwiephone
? Myślałem, że tylko próbujemy wykluczyćone
?-not
, oznacza to, że powodujefind
wykluczenie plików w katalogu o nazwiephone
.W Zsh ,
setopt extended_glob
wpisz~/.zshrc
. Następnie możesz użyć wzoru wieloznacznego,^one
aby wykluczyć nazwany katalogone
.Jeśli chcesz rekursować w podkatalogach, użyj
**/
do rekurencyjnego globowania. Aby wykluczyć katalog wywoływanyone
na najwyższym poziomie, a także katalog najwyższego poziomu:Aby wykluczyć pliki z nazwanego podkatalogu
one
, ale nie pliki z jego podkatalogów:Aby wykluczyć pliki z podkatalogu wywoływanego
one
na dowolnym poziomie, użyj wzoru powtarzania z#
operatorem wokół negacji:źródło