シェルを使用してすべてのサブディレクトリでファイルを検索し、それらのファイルをコピーするにはどうすればよいですか?


8

ls -R *.mp3いくつかのサブディレクトリを含むディレクトリのような再帰的なコマンドで* .mp3ファイルだけを見つけ、最後にこれらのファイルを選択したディレクトリにコピーするにはどうすればよいですか。

ご協力ありがとうございました。

回答:


14

コマンドは次のとおりです。

find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;

代替:

find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/

例:

alex@MaD-pc:~/test$ ls
1  2  3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt  2.mp3  3.txt

2:
4.txt  5.mp3  6.txt

3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3  5.mp3

詳細については:

man find

裁判官も受け入れる:find /path/to/dir/ -name '*.c' | xargs cp -t /target/
オリ

私は裁判官の一人であり、この解決策を否定します8-)コメントをありがとう、私はそれを追加します:)
hytromo

1
xargs通常ははるかに高速です。ここで簡単なテストを実行ls -lして、cファイルのロードを見つけて実行しました。これは0m2.420sでxargs、0m25.494sは-exec...です。明らかにこの場合、cp操作はほとんどの時間を要するため、おそらく問題ではありませんが、注意する価値があります。
オリ

-n`` switch to the cp`コマンドを追加して、名前が重複する場合の上書きを回避することをお勧めします(または、コピーの前に重複をチェックし、必要に応じてターゲットの名前を変更するスクリプトを作成します)
Eeek Geek

2

あなたの目的に完全に合うと思う別の方法もあります。あなたは組み合わせることができfindwhileループもいずれかの使用する必要はありませんexecか、xargsまったく。たとえば、mp3sダウンロードフォルダーから音楽フォルダーにをコピーしたい場合は、私が何度も使用した次のスクリプトを使用します。

find結果のファイルを検索して配置するディレクトリを変更することにより、必要に応じて変更できます。ディレクトリが指定されていない場合findは、ホームフォルダ全体が検索されます。また、変更することができますcpmv、または他のコマンド。3945 .jpgファイルでテストしたばかりなので、かなり高速です!それをテキストエディタにコピーして保存し、を実行して実行可能にしますchmod +x myscript

#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f; 
do cp -- "$f" ~/Music ;
done

この注目のBash wikiでは、whileループとreadコマンドを組み合わせてコマンドの出力を処理することがいかに便利かが示されていますfind。私が行った方法では、スペースやその他の予期しない文字や特殊文字が含まれるファイル名に遭遇してもスクリプトが壊れないようにしています。

findコマンドの一般的な情報については、ターミナルに入力するman findか、オンラインUbuntuマンページを参照してください。findの使い方の優れた紹介については、この記事も参照してください。


find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; done簡単ではないですか?
steabert 2012

私の方法はベストプラクティスを表しており、引用したリンクに記載されているように、スクリプトが壊れないようにしています。

ああ、なるほど、リンクのおかげで特殊文字の処理が処理されます:)
steabert

-n`` switch to the cp`コマンドを追加して、名前が重複する場合の上書きを回避することをお勧めします(または、コピーの前に重複をチェックし、必要に応じてターゲットの名前を変更するスクリプトを作成します)
Eeek Geek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.