xargs
Es la herramienta para el trabajo. Eso o find
con -exec … {} +
. Estas herramientas ejecutan un comando varias veces, con tantos argumentos como se pueden pasar de una vez.
Ambos métodos son más fáciles de llevar a cabo cuando la lista de argumentos variables está al final, lo cual no es el caso aquí: el argumento final mv
es el destino. Con las utilidades GNU (es decir, en Linux no integrado o Cygwin), la -t
opción mv
es útil, para pasar el destino primero.
Si los nombres de archivo no tienen espacios en blanco ni ninguno \"'
, simplemente puede proporcionar los nombres de archivo como entrada xargs
(el echo
comando es un bash incorporado, por lo que no está sujeto al límite de longitud de la línea de comando):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Puede usar la -0
opción para xargs
usar una entrada delimitada por nulos en lugar del formato predeterminado entre comillas.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Alternativamente, puede generar la lista de nombres de archivo con find
. Para evitar recurrir a subdirectorios, use -type d -prune
. Como no se especifica ninguna acción para los archivos de imagen enumerados, solo se mueven los otros archivos.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Esto incluye archivos de puntos, a diferencia de los métodos comodín de shell).
Si no tiene utilidades GNU, puede usar un shell intermedio para obtener los argumentos en el orden correcto. Este método funciona en todos los sistemas POSIX.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
En zsh, puede cargar el mv
archivo incorporado :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
o si prefiere dejar que mv
otros nombres sigan refiriéndose a los comandos externos:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
o con globos de estilo ksh:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Alternativamente, usando GNU mv
y zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/