2012-12-19 8 views
5

特定のファイルを見つけるためにディレクトリを再帰的に横断する方法を探していて、検索をやめてファイルパスをawk関数などにパイプします。 I asked a question earlier that was similarですが、私以外のマシンでテストしたところ、locateコマンドは動作しません。全員が自分のシステムでそれを使用しているわけではないからです。私が使用特定のファイルを見つけてstdout/awkにパイプします

のコードを見つけます:

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

を1に制限して使用します場所を探す代わりにfindを使うことができます – Heisenbug

+0

@Heisenbug - 私はそれについて考えましたが、本当に何かを見つけられませんでした1つのファイルを見つけることに失敗しました。私は 'locate'で行ったのと同じ方法で使用しますか?おかげで –

答えて

6

find(1)コマンドは、それを行います。 1行だけを取得するには、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

いいですか?あなたの例でこれを達成するにはどうすればよいでしょうか? '/ path/location /'で検索を開始します。 –

+0

@SamOlde '.'を'/path/location'に変更します。私はこれを示す答えを編集しました。 – kmkaplan

+0

- 完璧に機能します!非常にありがとう:) –

1

1つのファイルだけが、その後、存在することがわかっている場合は、

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

を使用することができますし、あなたがわからない場合は、使用ヘッドは、xargsの

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

+0

私はただ見つかった最初のものの結果を取得したいが、私は複数のファイルが存在することを知っている。例をありがとう。私はfindが 'locate 'と同じくらい速かったらいいと思っています: -/ –

+0

検索は余分なスイッチを追加することで高速に行うことができました。たとえば、ファイルが2つ以上のディレクトリレベルでないことがわかっている場合は、-maxdepth 2を追加し、-type fを使用してfindのみを検索するように制限することもできます。ですから、あなたはすべてを見つけることができます./-name "target_file.txt" -type f -maxdepth 2 | | xargs -I {} cp -r {} $ dir/ –

+0

良い情報です。スイッチがあっても、それは私が望むほど速くはありません。私は、あなたが持っているものに言及する時間を割いていただきありがとうございます。 :) –

関連する問題