¿Cómo puedo mover archivos con xargs en Linux?

24

Estoy intentando esto y no funciona:

ls file_* | xargs mv {} temp/

¿Algunas ideas?

Peter Mortensen
fuente
¿Alguien con una versión de movimiento de varios archivos de esto? ( xargs -n10por ejemplo)
Gert van den Berg

Respuestas:

31

En OS X:

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

En Linux:

ls file_* | xargs -i {} mv {} temp/
Amadan
fuente
1
En Linux, al menos, /al final es opcional. Puede incluirlo si lo desea, pero no es necesario.
Scott
44
@ user1953864: -i(o -J) especifique un token que se reemplazará con los argumentos entrantes, en lugar de que simplemente se agreguen al final. man xargs
Amadan
14
Puede que tenga que decir -i{}, sin un espacio. O decir -I {}.
Scott
1
Noté que usar "%" en lugar de "{}" también funciona: ¿qué significa% y qué significa {}? Ejemplo: ls file_ * | xargs -I% mv% temp /
dmonopoly
3
@dmonopoly: No significan nada. Cualquiera que sea el parámetro -i, se está reemplazando. ls file_* | xargs -iFOO mv FOO temp/Funciona exactamente igual.
Amadan
8

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

findes mejor que lsdonde pueda haber más archivos que la cantidad de argumentos de programa permitidos por su shell.

David-SkyMesh
fuente
2
Tenga en cuenta que la pregunta sugiere un deseo de procesar solo los file_*archivos en el directorio actual, mientras que find(sin opciones adicionales) buscará todo el árbol de directorios en el directorio actual.
Scott
1
Si verdad. Agregar -maxdepth 0para evitar esto.
"mejor" es subjetivo. Más poderoso, más complejo y más lento; y aunque mvno le importa si procesa archivos juntos o individualmente, algunos otros usos podrían hacerlo.
Amadan
Editado (agregado -maxdepth 0)
8

Use -t "especifique el direccionamiento objetivo" en mv, debería funcionar moviendo archivos * al directorio de destino / temp

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

Ratheesh
fuente
4

Según lo sugerido por @ user1953864: { -i, -J} especifique un token que se reemplazará con los argumentos entrantes.

Por ejemplo ls:

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

Luego, para mover todos los archivos java a la carpeta someDirectory con xargssería como sigue:

En Linux

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

En MacOS

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

Otra solución podría ser:

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

La desventaja es que bifurca un nuevo mvproceso para cada archivo.

Basile Starynkevitch
fuente