Escludere una directory nel modello di corrispondenza `ls`


13

Sto provando a lsdirs con .pngfile all'interno (non c'è bisogno di ricorsività, anche se sarebbe molto utile), eccetto uno. Escludere una directory, ad es

ls */*.png

funziona bene.

ls (^one)*/*.png

non restituisce stdout. Come lo raggiungo?

Sono cieco e lo convoglio espeak, quindi posso solo sentire stdout per ora.


Quale shell stai usando? Il tuo modello sembra un modello zsh, anche se non utile in quanto non escluderebbe one(il modello giusto sarebbe ^one/*.png), stamperebbe tutto.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


16

Opzione 1 - usando solo ls:
con il globbing esteso bash attivato ( shopt -s extglob) puoi fare:

ls !(one*)/*.png


Opzione 2 : combinazione lse grep:

Puoi combinare lscongrep -v

  • per esempio ls */*.png | grep -v "one/"


Opzione 3 - (la migliore IMO) ma findnon utilizza ls:

Per la ricerca ricorsiva di tutte le sottodirectory usando find

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


Tutte le righe di cui sopra elencheranno le directory con i .pngfile mentre filtrano qualsiasi corrispondenza di percorso one/; solo l'Opzione 3 lo farà in modo ricorsivo.


Il findcomando non ha bisogno di dire -path "*/one/*"o -path "./one/*"?
G-Man dice "Ripristina Monica" il

@ G-Man hai perfettamente ragione. Modificato sopra.
Toxefa,

Non corrisponderebbe ancora ./phone/handset.png?
G-Man dice "Ripristina Monica" il

@ G-Man Cosa c'è che non va nella corrispondenza di .pngs in una directory chiamata phone? Pensavo che stessimo solo cercando di escludere one?
toxefa

1
Bene, poiché lo stai usando in connessione con -not, significa che provoca l' findesclusione dei file in una directory chiamata phone.
G-Man dice "Ripristina Monica" il

6

In zsh , inserisci il setopt extended_globtuo ~/.zshrc. Quindi è possibile utilizzare il modello jolly ^one per escludere la directory chiamata one.

ls ^one/*.png

Se si desidera ricorrere in sottodirectory, utilizzare **/per il globbing ricorsivo. Per escludere la directory chiamata oneal livello superiore, nonché la directory al livello superiore:

ls ^one/**/*.png

Per escludere i file in una sottodirectory chiamata one, ma non i file nelle sue sottodirectory:

ls **/^one/*.png

Per escludere i file in una sottodirectory chiamata onea qualsiasi livello, utilizzare un modello di ripetizione con l' #operatore attorno alla negazione:

ls (^one/)#/*.png
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.