2012-12-19 11 views
5

Sto cercando un modo per scorrere ricorsivamente le directory per trovare un file specifico, quindi interrompere la ricerca e reindirizzare il percorso del nome file a una funzione awk o qualcosa di simile. I asked a question earlier that was similar, ma dopo aver provato su macchine diverse dalla mia risulta che il comando locate non funzionerà poiché non tutti lo usano sul loro sistema.Trova un file specifico, quindi reindirizza a stdout/awk

codice che ho usato con individuare:

dir="/path/to/destination/"; 
mkdir "$dir"; 
locate -l 1 target_file.txt | \ 
    awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | \ 
    sh 
+0

potresti usare find invece di individuare – Heisenbug

+0

@Heisenbug - ci ho pensato, ma non ho potuto trovare qualcosa di specifico fic per trovare un file. Lo userei nello stesso modo in cui ho usato 'locate'? grazie –

risposta

6

Il comando find(1) lo farà. Per ottenere solo una riga, utilizzare head(1).

dir="/path/to/destination/"; 
mkdir "$dir"; 
find /path/location -name target_file.txt | 
    head -n 1 | 
    awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | 
    sh 
+0

nice - una domanda però; dal momento che trova più o meno trova il file senza specificare una directory di partenza come potrei ottenere questo con il tuo esempio? iniziare a cercare su/percorso/posizione/' –

+0

@SamOlde Si cambia' .' in '/ percorso/posizione'. Ho modificato la risposta per mostrarlo. – kmkaplan

+0

- funziona perfettamente! grazie mille :) –

1

Se si conosce solo un file esiste, allora si può usare

find ./ -name "target_file.txt" -exec cp -r {} $dir \;

E se non si è sicuri, utilizzare la testa per limitare 1 e utilizzare xargs

find ./ -name "target_file.txt" | head -1 | xargs -I {} cp -r {} $dir/

+0

So che esiste più di un file, anche se voglio solo ottenere il risultato del primo trovato. Grazie per gli esempi; Vorrei che la ricerca fosse veloce come 'locate': -/ –

+0

Trova potrebbe essere fatto velocemente aggiungendo ulteriori interruttori. Ad esempio, se si sa che il file non sarà più di due livelli di dir in basso, è possibile aggiungere -maxdepth 2 e limitare anche find alla ricerca di file usando -type f. Quindi in Tutto puoi provare find ./nome "target_file.txt" -tipo f -maxdepth 2 | capo -1 | xargs -I {} cp -r {} $ dir/ –

+0

buona informazione di sicuro; anche con gli switch non è ancora veloce come mi piacerebbe che fosse. Apprezzo che ti prendi il tempo per menzionare quello che hai. :) –