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?

Peter Mortensen
la source
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/
Amadan
la source
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.

David-SkyMesh
la source
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

Ratheesh
la source
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
mdk
la source
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.

Basile Starynkevitch
la source