GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo usar el comando 'cp' para excluir un directorio específico?

Por qué usar rsync cuando puedes hacer:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Esto supone que la estructura del directorio de destino es la misma que la del origen.


cp -r `ls -A | grep -v "c"` $HOME/

Bueno, si la exclusión de ciertos patrones de nombre de archivo tuviera que ser realizada por cada utilidad de archivo de Unix (como cp, mv, rm, tar, rsync, scp, ...), se produciría una inmensa duplicación de esfuerzos. En su lugar, tales cosas se pueden hacer como parte del englobamiento, es decir, por su caparazón.

golpe

man 1 bash , / extglob .

Ejemplo:

$ shopt -s extglob
$ echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
images/004.bmp images/2252.png

Así que solo pones un patrón dentro de !() , y niega el partido. El patrón puede ser arbitrariamente complejo, a partir de la enumeración de rutas individuales (como muestra Vanwaril en otra respuesta):!(filename1|path2|etc3) , a cosas similares a expresiones regulares con estrellas y clases de caracteres. Consulte la página de manual para obtener más detalles.

zsh

man 1 zshexpn , / generación de nombre de archivo .

Puedes hacer setopt KSH_GLOB y usa patrones tipo bash. O,

% setopt EXTENDED_GLOB
% echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png

Entonces x~y coincide con el patrón x , pero excluye el patrón y . Una vez más, para obtener detalles completos, consulte la página de manual.

peces

El caparazón de pescado tiene una respuesta mucho más bonita a esto:

🐟 cp (string match -v '*.excluded.names' -- srcdir/*) destdir

Consejo profesional adicional

Escribe cp * , presiona Ctrl X * y solo mira lo que pasa.


rsync es rápido y fácil:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

Puedes usar --exclude varias veces.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

Tenga en cuenta que el directorio thefoldertoexclude después de --exclude la opción es relativa al sourcefolder , es decir, sourcefolder/thefoldertoexclude .

También puede agregar -n para una ejecución en seco para ver qué se copiará antes de realizar una operación real, y si todo está bien, elimine -n desde la línea de comandos.


Linux
  1. Cómo usar el comando Linux Rsync (sincronización remota)

  2. ¿Cómo programar un comando Rsync?

  3. ¿Cómo usar el comando Rsync en Linux?

  4. ¿Cómo usar el comando 'mv' para mover archivos excepto aquellos en un directorio específico?

  5. ¿Cómo usar expresiones regulares con el comando de búsqueda?

Cómo usar el comando cd de Linux para cambiar de directorio

Cómo usar el comando cd en Linux

Cómo usar Rsync

Cómo excluir un directorio al buscar archivos en Linux

Cómo usar el comando PS

Cómo usar el comando SUPERIOR