Por lo tanto, puede usarlo *como comodín para todos los archivos cuando lo use cpdentro del contexto de un directorio. ¿Hay alguna manera de copiar todos los archivos excepto el xarchivo?
Por lo tanto, puede usarlo *como comodín para todos los archivos cuando lo use cpdentro del contexto de un directorio. ¿Hay alguna manera de copiar todos los archivos excepto el xarchivo?
Respuestas:
En bashpuedes usar extglob:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
donde !(b*)excluir todos los b*archivos.
Más tarde puede deshabilitar extglobcon
$ shopt -u extglob
findes 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 -aPinterruptor:
a: similar a cp -a, recursivo, etc. P: muestra el progreso, una buena característica de rsync.
-rPlugar de -aPsi desea recurrir. -aes para archivar. No estoy seguro si esto cambió o si es diferente en MacOS.
rsynctiene 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, zshadmite esta sintaxis:
$ cp ^x /path/to/destination
Donde ^xsignifica "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, bashy 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 findcomo 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