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?

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.


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 {} +
    

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é.


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).


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.