web-dev-qa-db-ja.com

あるディレクトリから別のディレクトリにファイルを再帰的にコピーする

すべての音楽をフォルダー/media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInsideに保管しています。すべてのmp3を/media/kalenpw/HDD/Musicにコピーしたいので、次を使用しました。

cp -R /media/kalenpw/MyBook/Music/*.mp3 /media/kalenpw/HDD/Music

ただし、これはルートミュージックフォルダーのmp3のみをコピーし、アーティストのサブディレクトリを開かず、それらのファイルをコピーしませんでした。

-Rはすべてのファイルを再帰的にコピーするという印象を受けました。上記の目標を達成するにはどうすればよいですか?

10
kalenpw

つかいます:

find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;

コマンドが機能しない理由は、ワイルドカード(*.mp3)を含む名前がコマンドの実行前に展開されるため、3つのファイル(01.mp302.mp303.mp3)がある場合、有効なコマンドは

cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music

ご覧のとおり、-Rはこの場合は効果がありません。

15
techraf

*.mp3、つまり.mp3で終わるファイル/ディレクトリ名を使用してコピーするファイル/ディレクトリについて特に言及しました。

したがって、.mp3ディレクトリで/media/kalenpw/MyBook/Music/で終わるファイル、および同様に、.mp3/media/kalenpw/MyBook/Music/で終わるすべてのディレクトリが再帰的にコピーされます。そのような一致するファイル/ディレクトリがない場合、何もコピーされません。

次に、すべての.mp3ファイルを/media/kalenpw/MyBook/Music/ recursivleyからディレクトリ/media/kalenpw/HDD/Music/にコピーします。

  • bashを使用:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • findを使用:

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    
5
heemayl

cpr を使用することもできます。

$ cd /media/kalenpw/HDD/Music
$ cpr -p '/\.mp3$/' '/media/kalenpw/MyBook/Music/'

-pcpr を指定しないと、コピーされたファイル名の完全なディレクトリパスが保持されることに注意してください。
-rを使用して(-pの代わりに) '/media.../Music/'の下のパスを保持できます。
また、cprは、ファイルが上書きされないように注意し、コピーされた繰り返しファイル名に「0001」で始まる番号を追加します。

1
circulosmeos