2010-01-07 4 views
4

find ./dir -type f -iname "*.t[argz]*[bz2]" -print | xargs mv --target-directory=dir semble échouer sur le fichier qui a des espaces dans le nom. comment l'améliorer? ou alternative?déplacer des fichiers de manière récurrente sur Linux

merci pour réponse ci-dessous: mon mv ne supporte pas --null ou -0, j'utilise Cygwin:

 
$ mv --help 
Usage: mv [OPTION]... [-T] SOURCE DEST 
    or: mv [OPTION]... SOURCE... DIRECTORY 
    or: mv [OPTION]... -t DIRECTORY SOURCE... 
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. 

Mandatory arguments t 
. 

Répondre

7

Utilisation -print0 au lieu de -print sur la commande find et les xargs (-0 ou --null) - alors les NUL seront utilisées comme séparateurs plutôt que comme nouvelles lignes et espaces.

find ./dir -type f -iname "*.t[argz]*[bz2]" -print0 | xargs --null mv --target-directory=dir 
+0

$ find ./ -type f -iname "* .xls" -print0 | xargs mv --null --target-directory = x ls xargs: Attention: un caractère NUL est apparu dans l'entrée. Il ne peut pas être passé par le dans la liste des arguments. Vouliez-vous utiliser l'option --null? Mv: option non reconnue '--null ' Essayez' mv --help' pour plus d'informations. – user217631

+0

Désolé - aurait dû être une option xargs, pas une option mv! Fixé. –

0

Avez-vous regardé l'option -exec pour trouver?

find ./dir -type f -iname "*.t[argz][bz2]" -exec mv {} --target-directory=dir ';' 

L'option exec exécutera toutes les options suivantes il comme une commande jusqu'à ce qu'il voit le point-virgule entre guillemets doubles. De cette façon, vous n'aurez pas à gérer le problème d'espacement.

+1

Cela engendre un sous-processus pour chaque fichier, cependant, où la variante xargs charge des centaines de fichiers sur la même ligne de commande. Pour les petites opérations comme une invocation mv simple, cela peut être une différence de performance significative. Bien que vous deviez utiliser -print0 et --null comme martin le souligne ci-dessus, sauf si vous êtes absolument sûr que les noms de fichiers n'ont pas d'espace. –

0

GNU trouver

find ./dir -type f -iname "*.t[argz]*[bz2]" -exec mv "{}" /destination +; 
Questions connexes