Comment déplacer récursivement des fichiers par type d'un répertoire et de ses sous-répertoires vers un autre répertoire?


30

Quelle serait une bonne façon de déplacer un type de fichier d'un répertoire et de tous ses sous-répertoires?

Comme "déplacer tous * .ogg dans / thisdir récursivement vers / somedir". J'ai essayé deux ou trois choses; mon meilleur effort était (toujours pas terrible):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

Il est retourné sur chaque ligne avant chaque nom de fichier,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

Réponses:


23

vous pouvez utiliser find avec xargs pour cela

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

Le -I dans la commande ci-dessus indique à xargs quelle chaîne de remplacement vous souhaitez utiliser (sinon il ajoute les arguments à la fin de la commande).

OU
Dans votre commande, essayez simplement de déplacer '{}' après la mvcommande.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;


1
n'oubliez pas de faire une sauvegarde avant d'essayer les commandes ci-dessus :-).
Hemant

2
Btw, pour le premier -print0 pour trouver et -0 pour xargs doit être utilisé autant que possible, pour éviter les espaces dans les problèmes de nom de fichier.
maxschlepzig

@maxschlepzig: bon point. Je vais éditer.
Hemant

2
Je suggère fortement d'utiliser mv -iici, afin de ne pas risquer d'écraser des fichiers si quelque chose d'inattendu se produit.
Gilles 'SO- arrête d'être méchant'

2
avec mv de gnu core utils vous pouvez utiliser mv -t <targetdir>et + au lieu de \;

10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

Vous avez un peu échangé les arguments pour mv


9

En zsh ou bash 4, pour rassembler tous les *.oggfichiers dans /somedir:

mv /thisdir/**/*.ogg /somedir

Si vous souhaitez reproduire la hiérarchie des répertoires: (avertissement, tapé directement dans le navigateur)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

au-delà de la pratique en bash
Mark
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.