Trovare sottodirectory all'interno di tutte le directory con lo stesso nome


8

Voglio eseguire un comando per:

  1. Trova tutte le directory denominate " inc" in una cartella " X".
  2. Elenca tutte le sottodirectory sotto ogni " X/.../inc/".
  3. Reindirizzare l'output su un file denominato " list"

Ho provato varie combinazioni del comando seguente, senza successo:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

Come posso fare questo?

Risposte:


13

find può fare tutto da solo:

find X -path '*/inc/*' -type d > list

Leggi la -pathparte di man findper maggiori informazioni.

Come ho detto rapidamente in un commento: se si memorizza la riga delle directory separata in un file di testo, i nomi delle directory contenenti newline non saranno rappresentabili in modo inequivocabile. Se si è certi che le directory non contengano nuove righe, va bene. Solo un'osservazione generale.


sì. ho dato la stessa risposta qui
principe John Wesley

Oppure trova X -name 'inc' -type d> list
MaQleod,

@MaQleod: No, non è questa la domanda.
Daniel Andersson,

4

Ecco un pratico one-liner:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

Funziona findsu ciascuno dei primi findrisultati. L' execopzione può anche prendere un comando di shell minimo, in cui - come ho detto - {}viene sostituito con ciascuna directory della prima find.

Il secondo find, su richiesta, "elenca tutte le sottodirectory" dei primi risultati, inclusa la incdirectory. Se non lo vuoi nell'output, lascia che il secondo abbia find almeno le cartelle di output di profondità 1.

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Quindi reindirizzeremo semplicemente il comando stdoutin list.


una variazione su quella risposta mi è stata utile dove volevo solo le subdirectory 1 di profondità della partita originale find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core

1

Bene, ho trovato la risposta per simulare questa scoperta nidificata:

find X/ -type d | grep "/inc/" > list

Bene, anche quello funzionerà! Tuttavia, nelle shell di Unix / Linux, non c'è davvero una cosa come la risposta. È una miscela di preferenze personali e ciò che è facile da seguire.
Vishal Kotcherlakota,

Prendersi cura di nomi di file non convenzionali (ma esistenti) con ad esempio newline: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zdelimita anche il carattere null, ma anche il suo output sembra essere separato da null, quindi quindi bisognerebbe passarlo attraverso per esempio xargs -0L1 echoper ottenerlo riga per riga ). In questo caso, poiché stai salvando l'elenco in un file con ogni voce separata da newline, le nuove righe nei nomi dei file verranno comunque rappresentate in modo ambiguo. Forse non hai nemmeno bisogno del file intermedio, a seconda di cosa vuoi fare con l'elenco.
Daniel Andersson,

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.