2012-12-19 5 views
5

Ich bin auf der Suche nach einer Möglichkeit, Verzeichnisse rekursiv zu durchsuchen, um eine bestimmte Datei zu finden, dann die Suche zu stoppen und den Dateinamen Pfad zu einer awk-Funktion oder etwas ähnliches. I asked a question earlier that was similar, aber nach dem Testen auf anderen Maschinen als meiner stellt sich heraus, locate Befehl wird nicht funktionieren, da nicht jeder es auf ihrem System verwendet.Suchen Sie eine bestimmte Datei und dann pipe to stdout/awk

-Code, die ich verwendet, um mit orten:

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

du könntest finden anstatt zu finden – Heisenbug

+0

@Heisenbug - ich dachte darüber nach, aber konnte nicht wirklich etwas finden, das speci war um eine Datei zu finden. Würde ich es genauso verwenden wie bei 'locate'? Danke –

Antwort

6

Der find(1) Befehl wird es tun. Um nur eine Zeile zu erhalten, verwenden Sie 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

nett - eine Frage obwohl; Da locate mehr oder weniger die Datei findet, ohne ein Startverzeichnis anzugeben, wie würde ich das mit Ihrem Beispiel erreichen? d. h., Sie beginnen mit der Suche nach '/ path/location /' –

+0

@SamOlde. Sie ändern das '.' in'/path/location'. Ich habe die Antwort bearbeitet, um dies zu zeigen. – kmkaplan

+0

- funktioniert perfekt! Vielen Dank :) –

1

Wenn Sie wissen, nur eine Datei vorhanden ist, dann können Sie

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

verwenden Und wenn Sie sich nicht sicher sind, verwenden Kopf 1 zu begrenzen und verwenden xargs

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

+0

Ich weiß mehr als eine Datei existiert, obwohl ich nur das Ergebnis der ersten gefunden haben will. Danke für die Beispiele; Ich wünschte, der Fund wäre so schnell wie 'locate': -/ –

+0

Suchen könnte schnell gemacht werden, indem zusätzliche Schalter hinzugefügt werden. Wenn Sie beispielsweise wissen, dass die Datei nicht mehr als zwei Verzeichnissenebenen unterschreitet, können Sie -maxdepth 2 hinzufügen und auch die Suche auf die Suche beschränken, indem Sie nur -type f verwenden. Also in Alles können Sie versuchen, ./ -name "target_file.txt" -type f -maxdepth 2 | zu finden Kopf -1 | xargs -I {} cp -r {} $ dir/ –

+0

gute Informationen sicher; Selbst mit den Schaltern ist es immer noch nicht so schnell wie ich es gerne hätte. Ich weiß es zu schätzen, dass du dir die Zeit genommen hast zu erwähnen, was du hast. :) –

Verwandte Themen