ls -R *.mp3いくつかのサブディレクトリを含むディレクトリのような再帰的なコマンドで* .mp3ファイルだけを見つけ、最後にこれらのファイルを選択したディレクトリにコピーするにはどうすればよいですか。
ご協力ありがとうございました。
ls -R *.mp3いくつかのサブディレクトリを含むディレクトリのような再帰的なコマンドで* .mp3ファイルだけを見つけ、最後にこれらのファイルを選択したディレクトリにコピーするにはどうすればよいですか。
ご協力ありがとうございました。
回答:
コマンドは次のとおりです。
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
xargs通常ははるかに高速です。ここで簡単なテストを実行ls -lして、cファイルのロードを見つけて実行しました。これは0m2.420sでxargs、0m25.494sは-exec...です。明らかにこの場合、cp操作はほとんどの時間を要するため、おそらく問題ではありませんが、注意する価値があります。
-n`` switch to the cp`コマンドを追加して、名前が重複する場合の上書きを回避することをお勧めします(または、コピーの前に重複をチェックし、必要に応じてターゲットの名前を変更するスクリプトを作成します)
あなたの目的に完全に合うと思う別の方法もあります。あなたは組み合わせることができfindてwhileループもいずれかの使用する必要はありませんexecか、xargsまったく。たとえば、mp3sダウンロードフォルダーから音楽フォルダーにをコピーしたい場合は、私が何度も使用した次のスクリプトを使用します。
find結果のファイルを検索して配置するディレクトリを変更することにより、必要に応じて変更できます。ディレクトリが指定されていない場合findは、ホームフォルダ全体が検索されます。また、変更することができますcpしmv、または他のコマンド。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簡単ではないですか?
-n`` switch to the cp`コマンドを追加して、名前が重複する場合の上書きを回避することをお勧めします(または、コピーの前に重複をチェックし、必要に応じてターゲットの名前を変更するスクリプトを作成します)
find /path/to/dir/ -name '*.c' | xargs cp -t /target/