Comment déplacer des fichiers avec xargs sous Linux?


24

J'essaye ceci et cela ne fonctionne pas:

ls file_* | xargs mv {} temp/

Des idées?


Quelqu'un avec une version de déplacement de fichiers multiples de cela? ( xargs -n10par exemple)
Gert van den Berg

Réponses:


31

Sous OS X:

ls file_* | xargs -J {} mv {} temp/

Sous Linux:

ls file_* | xargs -i {} mv {} temp/

1
Sous Linux, au moins, /à la fin est facultatif. Vous pouvez l'inclure si vous le souhaitez, mais ce n'est pas nécessaire.
Scott

4
@ user1953864: -i(ou -J) spécifiez un jeton qui sera remplacé par les arguments entrants, au lieu d'être simplement collés à la fin. man xargs
Amadan

14
Vous pourriez avoir besoin de dire -i{}, sans espace. Ou dites -I {}.
Scott

1
Je remarque que l'utilisation de "%" à ​​la place de "{}" fonctionne également - que signifie% et que signifie {}? Exemple: ls file_ * | xargs -I% mv% temp /
dmonopoly

3
@dmonopoly: Ils ne veulent rien dire . Quel que soit le paramètre -i, il est remplacé. ls file_* | xargs -iFOO mv FOO temp/fonctionne exactement de la même manière.
Amadan

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findest meilleur que lslà où il pourrait y avoir plus de fichiers que le nombre d'arguments du programme autorisé par votre shell.


2
Notez que la question suggère un désir de ne traiter que les file_*fichiers du répertoire courant, tandis que find(sans options supplémentaires) recherchera l'arborescence de répertoires entière sous le répertoire courant.
Scott

1
Oui c'est vrai. Ajoutez -maxdepth 0pour éviter cela.

"mieux" est subjectif. Plus puissant, plus complexe et plus lent; et même si mvpeu importe si vous traitez des fichiers ensemble ou individuellement, d'autres utilisations pourraient le faire.
Amadan

Modifié (ajouté -maxdepth 0)

8

Utilisez -t "spécifier la cible directe" sur mv, cela devrait fonctionner en déplaçant les fichiers * vers le répertoire de destination / temp

ex: - #ls -l fichier * | xargs mv -t / temp


4

Comme suggéré par @ user1953864: { -i, -J} spécifiez un jeton qui sera remplacé par les arguments entrants.

Par exemple ls:

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

Ensuite, déplacer tous les fichiers java dans le dossier someDirectory avec xargsserait comme suit:

Sous Linux

ls *.java | xargs -i mv {} someDirectory/

Sur MacOS

ls *.java | xargs -J mv {} someDirectory

0

Une autre solution pourrait être:

 for f in file_* ; do
   mv $f temp/$f
 done

L'inconvénient est qu'il crée un nouveau mvprocessus pour chaque fichier.

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.