Puede usar los patrones de globbing avanzados en algunos shells para hacer coincidir todos los archivos en un directorio, excepto los que coinciden con un patrón en particular. Por ejemplo, en ksh, bash o zsh, el comando
shopt -s extglob ## needed in bash only
setopt ksh_glob ## needed in zsh only
mv /source/!(*.bak) /destination
moverá todos los archivos /source
a /destination
excepto los archivos que coincidan *.bak
. En zsh, también puede escribir /source/^*.bak
si se ejecuta por primera vez setopt extended_glob
, y de manera más general (una vez más setopt extended_glob
) /source/*~*.bak
(o /source/a*~*.bak
para todos los archivos cuyo nombre comienza con a
excepción de los .bak
archivos, etc.).
Zsh tiene un comando de copia / movimiento / enlace masivo que se puede utilizar, entre otros, para mover todos los archivos, excepto los que coinciden con un patrón. Por ejemplo, el siguiente comando mueve todos los archivos excepto *.bak
de /source
a target
y agrega .bak
a su nombre en el proceso:
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
Hay varios comandos llamados rename
flotando. En Debian y Ubuntu, /usr/bin/rename
es un script perl que mueve archivos a un nuevo nombre generado por una expresión perl. Puede excluir el cambio de nombre de los archivos al no generar un nuevo nombre si se va a excluir el archivo. Por ejemplo, el siguiente comando (usando este rename
programa en particular ) mueve todos los archivos excepto *.bak
de /source
a /target
:
rename 's!/source!/target! unless m!\.bak$!' /source/*
Puede usar el find
comando para seleccionar los archivos que desea mover. Por ejemplo, el siguiente comando mueve todos los archivos normales excepto *.bak
en /source
o un subdirectorio /target
(tenga en cuenta que la estructura del directorio está contraída):
find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
o (más eficiente si hay muchos archivos para mover)
find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
rsync
es una generalización cp
y scp
con reglas de inclusión / exclusión muy potentes. Por ejemplo, el siguiente comando copia todos los archivos excepto *.bak
en /source
o un subdirectorio /target
, respetando la estructura del directorio:
rsync -a --exclude '*.bak' /source/ /target/
pax
es (entre otras cosas) otro cp
con esteroides. Sus reglas de exclusión no son tan poderosas como las de rsync, pero tiene la capacidad adicional de cambiar el nombre de los archivos a medida que se copian. Si cambia el nombre de un archivo a la cadena vacía, se excluye de la copia. Por ejemplo, el siguiente comando copia todos los archivos excepto *.bak
en /source
o un subdirectorio en /target
, y cambia el nombre de los archivos de .bak
pasada.
cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
El ejemplo anterior tiene el desafortunado efecto secundario de crear directorios llamados foo.bak
, que se pueden evitar combinando find
con pax
:
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destination
eso no hará lo que quieres que haga