カレントディレクトリ"."以下を再帰的に検索して、.txtの拡張子がついたファイルを、1階層上の../tmpディレクトリ以下にコピーする。

当初想定よりもファイルが膨らんだときや、処理のしやすさから、一つのディレクトリにデータを一時的に集約する場合に良く重宝しています。しばらく経つと忘れるので、備忘録を兼ねて。
※MACターミナル(BSD系)での動作確認です。



より安全にバックアップとしてオリジナルを残しておきたい時
find . -type f -name "*.txt" -exec cp {} ../tmp \;

移動する場合
find . -type f -name "*.txt" -exec mv {} ../tmp \;

スポンサーリンク

まずは、検索したファイル名を表示させて、移動/コピーして問題ないかを確認

下記で確認をする。
find . -type f -name "*.txt"

-nameオプションで検索ファイルを絞ることができる。ワイルドカード*が使えるので便利。
不要なファイルを移動するリスクを考えて、絞るようにしています。
-type fはファイルのみ対象にするオプションです。

スポンサーリンク

-execオプションでファイル名をmv/cpコマンドに渡してあげる

更に、「find . -type f -name "*.txt"」の後ろに「-exec cp {} ../tmp \;」を追加してあげることで、
ファイル名がcpコマンドに渡されます。覚えてしまえば本当に便利。

find . -type f -name "*.txt" -exec cp {} ../tmp \;

もしくはxargsの-Jオプションでファイル名をmv/cpコマンドに渡してあげる

もしくはxargsの-Jオプションも使いやすいと思います。
find . -type f -name "*txt" -print | xargs -J% cp % ../tmp

コピーcp/移動mv先のディレクトリは、検索対象のディレクトリよりも上の階層のディレクトリにすることに注意

検索対象のディレクトリ以下に、cp/mv先のディレクトリを指定してしまうと、そのディレクトリも検索対象となってしまいます。なので、検索対象のディレクトリよりも上の階層にしてあげることが大事です。

「../tmp」として、一つ上の階層にコピーcp/移動mv先を指定しています。
よくやりがちなミスです。

スポンサーリンク