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

11

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

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

toutefois, cela n'a copié que les mp3 dans le dossier de musique racine et n'a ouvert aucun des sous-répertoires d'artistes et copié ces fichiers.

J'avais l'impression de -Rcopier récursivement tous les fichiers. Comment puis-je atteindre cet objectif?

kalenpw
la source

Réponses:

19

Utilisation:

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

La raison de votre commande ne fonctionne pas est que les noms contenant des caractères génériques ( *.mp3) sont étendus avant que la commande est exécutée, donc si vous aviez trois fichiers ( 01.mp3, 02.mp3, 03.mp3) votre commande efficace é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 voir, cela -Rn'a aucun effet dans ce cas.

techraf
la source
Je recommande -inameplutôt que -namesi des fichiers se terminent .MP3.
Olathe
Merci cela a fonctionné. Ou du moins est en train de travailler.
kalenpw
5

Vous avez spécifiquement mentionné le (s) fichier (s) / répertoire (s) à copier en utilisant par *.mp3exemple n'importe quel nom de fichier / répertoire se terminant par .mp3.

Ainsi, tout fichier se terminant par .mp3dans le /media/kalenpw/MyBook/Music/répertoire et de la même manière, tout répertoire se terminant par .mp3en /media/kalenpw/MyBook/Music/sera copié, récursivement. S'il n'existe aucun fichier / répertoire correspondant, rien ne sera copié.

Maintenant, pour copier tous les .mp3fichiers de /media/kalenpw/MyBook/Music/recursivley dans le répertoire /media/kalenpw/HDD/Music/:

  • En utilisant bash:

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

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    
heemayl
la source
Merci, techraf a répondu en premier, j'ai donc accepté leur réponse.
kalenpw
1

Vous pouvez également utiliser cpr :

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

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

circulosmeos
la source
1

Supposons que vous avez un tas de .docx, .mp3, .txtet les .xlsxfichiers stockés dans cette structure de répertoire:

/files/
/files/dir1/
/files/dir1/dir11/
/files/dir1/dir12/
/files/dir1/dir13/
/files/dir2/
/files/dir3/
/files/dir3/dir31/
/files/dir3/dir32/
/files/dir4/
/files/dir5/
/files/dir51/
/files/dir52/
/files/dir53/
/files/dir54/

... et que vous voulez dans récursif tous ces répertoires afin de copier tous trouvés les .mp3fichiers à /home/me/music/mais vous ne pas souhaitez conserver cette arborescence dans la destination (vous voulez que tous trouvés les .mp3fichiers à copier au /home/me/music/lieu de copier dans les répertoires respectifs comme /home/me/music/dir1/, /home/me/music/dir1/dir11/et cetera).

Dans ce cas, sur le terminal shell (bash), exécutez d'abord cette commande afin d'accéder à la racine de votre recherche de fichiers:

cd /files

... puis exécutez cette commande:

for i in `find . -iname '*.mp3'`; do cp $i /home/me/music/; done

Si vous souhaitez conserver l'arborescence du répertoire source dans la destination, exécutez cette commande à la place (après l'exécution cd /files):

find . -iname '*.mp3' | cpio -pdm /home/me/music/

Sur les commandes ci - dessus, la recherche est insensible à la casse (ie matchs .mp3, .MP3, .mP3et .Mp3). Utilisez -nameplutôt que -inamesi vous souhaitez que la recherche soit sensible à la casse (par exemple, l'utilisation -namede la .mp3chaîne de caractères correspondra aux fichiers se terminant par .mp3mais pas à ceux se terminant par .MP3, .mP3ni .Mp3).

Yuri Sucupira
la source
Dans le cas où vous souhaitez conserver la structure du répertoire, exécutez cette commande à partir du répertoire source. Si vous exécutez find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/, il créera / home / me / music / source / dir et les fichiers seront copiés vers ce nouvel emplacement.
Gautam