Trova i file in Linux ed escludi directory specifiche


14

Ho una ricerca simile a questa:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Vorrei aggiungere per escludere una directory chiamata "test" nella ricerca, ma non riesco a capire come aggiungere "-type d" in qualche modo. Come ho fatto a farlo?

Grazie!

Risposte:


22

È possibile utilizzare l' -pathopzione per trovarla e combinarla con l' -notoperatore.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Si prega di notare due cose

  • -path deve venire come primo argomento
  • il modello corrisponde all'intero nome file, quindi -path testnon corrisponderà mai a nulla

A proposito, non sono sicuro del motivo per cui stai usando le parentesi, non fa differenza. È usato solo per precedenza, per costrutti come ! \( -name '*bla*' -name '*foo*' \)(cioè, non trovare cose che hanno entrambi blae foo).

Un ulteriore perfezionamento: non c'è bisogno di usare il loop bash, puoi semplicemente farlo

find . ... -exec cat {} \; -exec echo \;

dove ... sono gli altri argomenti a find.


2
find / -path ./test -prune -o ...

Rinomina ./testper adattarla alla posizione della directory di test.


2
In questo caso, non dimenticare di aggiungere l'azione -print (perché -print non è un'azione predefinita) dopo l'opzione -o
Bill Zhao,

1

Puoi provare con grep in questo modo (la cartella qui si chiama test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

o se la tua ricerca restituisce il percorso relativo:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

o se si desidera tutte le cartelle con lo stesso nome ma con percorso diverso

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

I migliori saluti,


1

Espandere ciò che penso @CharlesClavadetschersarebbe successo con la sua risposta. Se si omette un percorso con -not -path ... findcontinuerà a scendere il percorso. Invece, l'utilizzo -pruneimpedirà che scenda ulteriormente nel percorso omesso, rendendolo più veloce. Quindi puoi fare qualcosa del genere

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

Uso "not wholename" quando sto solo cercando un file. -name verifica il nome file effettivo, ma -wholename verifica l'intero percorso. Quindi aggiungendo un ignore per test alla domanda sopra:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
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.