Por lo tanto, puede utilizar *
como comodín para todos los archivos cuando los utilice cp
dentro del contexto de un directorio. ¿Hay alguna manera de copiar todos los archivos excepto x
el archivo?
Respuesta1
Rsync maneja esto muy bien.
Ejemplo copiar todo:rsync -aP /folder1/* /folder/2
Ejemplo copiar todo con exclusión:rsync -aP --exclude=x /folder1/* /folder2/
El -aP
interruptor:
a
: Similar acp -a
, recursivo, etc.P
: Muestra el progreso, una característica interesante de rsync.
Respuesta2
En bash
puedes usar extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
donde !(b*)
excluir todos b*
los archivos.
Luego puedes desactivar extglob
con
$ shopt -u extglob
Respuesta3
Esta no es una característica de cp
, es una característica de su shell (se expande *
para significar todos los archivos que no son puntos), por lo que la respuesta depende de qué shell esté usando. Por ejemplo, zsh
admite esta sintaxis:
$ cp ^x /path/to/destination
Donde ^x
significa "todos los archivos excepto x
"
También puede combinar patrones de selección y anulación de selección, por ejemplo, para copiar todos los archivos wav excepto aquellos que contienen xyz, puede usar:
cp *.wav~*xyz*
Respuesta4
También se puede hacer en el antiguo shell Bourne (portátil/compatible) de varias maneras con herramientas estándar y de maneras mucho menos elegantes que usando el shell avanzado o comandos con opciones de exclusión integradas.
Si no hay demasiados archivos (y no con nombres que incluyan espacios y/o saltos de línea), esta podría ser una manera:
cp `ls | egrep -v '^excludename$'` destdir/.
Claro, bash
y las herramientas GNU son geniales y poderosas, pero todavía no siempre están disponibles. Si tiene la intención de ponerlo en un script portátil, lo recomendaría find
como en el comentario de Rush.