web-dev-qa-db-fra.com

Copier récursivement des fichiers d'un répertoire à un autre

J'ai toute ma musique dans un dossier /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside. Je veux copier tous les mp3 au /media/kalenpw/HDD/Music alors j'ai utilisé:

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

toutefois, cela ne fait que copier les mp3 dans le dossier de musique racine et ne pas ouvrir les sous-répertoires de l'artiste et copier ces fichiers.

J'avais l'impression que -R copierait tous les fichiers de manière récursive. Comment puis-je atteindre ledit objectif?

9
kalenpw

Utilisation:

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

La raison pour laquelle votre commande ne fonctionne pas est que les noms contenant des caractères génériques (*.mp3) sont développés avant l'exécution de la commande. Par conséquent, si vous aviez trois fichiers (01.mp3, 02.mp3, 03.mp3), votre commande effective était:

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

Comme vous pouvez le constater, -R n'a aucun effet dans ce cas.

15
techraf

Vous avez spécifiquement mentionné les fichiers/répertoire (s) à copier comme utilisant *.mp3 c'est-à-dire tout nom de fichier/répertoire se terminant par .mp3.

Ainsi, tout fichier se terminant par .mp3 dans le répertoire /media/kalenpw/MyBook/Music/ et de la même manière, tout répertoire se terminant par .mp3 dans /media/kalenpw/MyBook/Music/ sera copié de manière récursive. Si aucun fichier/répertoire ne correspond, rien ne sera copié.

Maintenant, copiez tous les fichiers .mp3 de /media/kalenpw/MyBook/Music/ recursivley dans le répertoire /media/kalenpw/HDD/Music/:

  • Utilisation de bash:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • Utilisation de find:

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

Vous pouvez également utiliser cpr :

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

Notez que sans -pcpr conservera les chemins de répertoire complets des noms de fichiers copiés.
-r peut être utilisé (au lieu de -p) pour conserver le chemin sous '/media.../Music/'.
cpr veillera également à ce qu'aucun fichier ne soit écrasé, en ajoutant un numéro commençant par "0001" à tout nom de fichier répété copié.

1
circulosmeos