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'
Steve Burdine
la source

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 \;

Hemant
la source
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

District de codage
la source
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
Gilles, arrête de faire le mal
la source
au-delà de la pratique en bash
Mark