Por lo tanto, puede usarlo *
como comodín para todos los archivos cuando lo use cp
dentro del contexto de un directorio. ¿Hay alguna manera de copiar todos los archivos excepto el x
archivo?
Por lo tanto, puede usarlo *
como comodín para todos los archivos cuando lo use cp
dentro del contexto de un directorio. ¿Hay alguna manera de copiar todos los archivos excepto el x
archivo?
Respuestas:
En bash
puedes usar extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
donde !(b*)
excluir todos los b*
archivos.
Más tarde puede deshabilitar extglob
con
$ shopt -u extglob
find
es la única manera de tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
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 a cp -a
, recursivo, etc. P: muestra el progreso, una buena característica de rsync.
-rP
lugar de -aP
si desea recurrir. -a
es para archivar. No estoy seguro si esto cambió o si es diferente en MacOS.
rsync
tiene la opción de hacerlo recursivo. Ejemplo: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Probado solo en Ubuntu)
Esta no es una característica de cp
, es una característica de su shell (se expande *
para que signifique 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 eliminación de selección, por ejemplo, para copiar todos los archivos wav excepto los que contienen xyz, puede usar:
cp *.wav~*xyz*
bash
?
También se podría hacer en una capa de bourne antigua (portátil / compatible) de varias maneras con herramientas estándar de una manera mucho menos elegante que usando comandos avanzados de shell o comandos con opciones de exclusión incorporadas.
Si no hay demasiados archivos (y no con nombres que incluyen 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 aún 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.
Si desea copiar todo en una carpeta (incluidas las subcarpetas) a un subdirectorio particular:
cp -R $(ls | grep -v '^subdir$') subdir/
Funciona con sh, bash, zsh (al menos).
cp -R * subdir/
cp
(no de bash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". Sin embargo, la copia se completa correctamente. Desafortunadamente, su variante se rompe con cualquier nombre de archivo que contenga un espacio o puntuación sensible al shell. Ver unix.stackexchange.com/q/128985/135943
extglob
Es la mejor manera hasta ahora, supongo.
Otra forma es usar
cp $(ls --ignore=x) subdir/
$
etc.) Nunca analice la salida de ls
. unix.stackexchange.com/q/128985/135943