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


24

Estoy intentando esto y no funciona:

ls file_* | xargs mv {} temp/

¿Algunas ideas?


¿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/

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.


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


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.