Estoy intentando esto y no funciona:
ls file_* | xargs mv {} temp/
¿Algunas ideas?
Estoy intentando esto y no funciona:
ls file_* | xargs mv {} temp/
¿Algunas ideas?
Respuestas:
En OS X:
ls file_* | xargs -J {} mv {} temp/
En Linux:
ls file_* | xargs -i {} mv {} temp/
/
al final es opcional. Puede incluirlo si lo desea, pero no es necesario.
-i
(o -J
) especifique un token que se reemplazará con los argumentos entrantes, en lugar de que simplemente se agreguen al final. man xargs
-i{}
, sin un espacio. O decir -I {}
.
-i
, se está reemplazando. ls file_* | xargs -iFOO mv FOO temp/
Funciona exactamente igual.
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
find
es mejor que ls
donde pueda haber más archivos que la cantidad de argumentos de programa permitidos por su shell.
file_*
archivos en el directorio actual, mientras que find
(sin opciones adicionales) buscará todo el árbol de directorios en el directorio actual.
mv
no le importa si procesa archivos juntos o individualmente, algunos otros usos podrían hacerlo.
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 xargs
sería como sigue:
En Linux
ls *.java | xargs -i mv {} someDirectory/
En MacOS
ls *.java | xargs -J mv {} someDirectory
Otra solución podría ser:
for f in file_* ; do
mv $f temp/$f
done
La desventaja es que bifurca un nuevo mv
proceso para cada archivo.
xargs -n10
por ejemplo)