Quiero copiar todos los archivos en un directorio excepto algunos archivos en un subdirectorio específico. He notado que el comando 'cp' no tenía una opción --exclude. Entonces, ¿cómo puedo lograr esto?
tar -c | tar -x
?
Quiero copiar todos los archivos en un directorio excepto algunos archivos en un subdirectorio específico. He notado que el comando 'cp' no tenía una opción --exclude. Entonces, ¿cómo puedo lograr esto?
tar -c | tar -x
?
Respuestas:
rsync es rápido y fácil:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
Puedes usar --exclude
múltiples 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 a la sourcefolder
, es decir, sourcefolder/thefoldertoexclude
.
También puede agregar -n
para la ejecución en seco para ver qué se copiará antes de realizar una operación real, y si todo está bien, elimínelo -n
de la línea de comandos.
--exclude
thefoldertoexclude
Cuál es el relativo al sourcefolder
directorio de trabajo actual? gracias
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
, de todos modos, votar a favor de rsync en lugar de find, ya que puede usar fácilmente rutas absolutas para la fuente mientras que en find es más complicado ya que usa {}
en dst.
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
o de local a remoto$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
Bueno, si cada utilidad de archivo unix-ish tuviera que realizar la exclusión de ciertos patrones de nombre de archivo (como cp, mv, rm, tar, rsync, scp, ...), se produciría una inmensa duplicación de esfuerzos. En cambio, tales cosas se pueden hacer como parte de la globulación , es decir, por su caparazón.
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 !()
y niega el partido. El patrón puede ser arbitrariamente complejo, comenzando por la enumeración de rutas individuales (como lo muestra Vanwaril en otra respuesta): !(filename1|path2|etc3)
a cosas similares a expresiones regulares con estrellas y clases de personajes. Consulte la página de manual para más detalles.
man 1 zshexpn
, / generación de nombre de archivo .
Puedes hacer setopt KSH_GLOB
y usar patrones tipo bash. O,
% setopt EXTENDED_GLOB % eco imágenes / * 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 más detalles, consulte la página de manual.
La concha de pescado tiene una respuesta mucho más bonita a esto:
🐟 cp (string match -v '* .excluded.names' - srcdir / *) destdir
Escriba cp *
, presione CtrlX*y solo vea lo que sucede. no es dañino lo prometo
zsh
aunque funciona.
setopt -u extglob
.
¿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.
-path
argumento para probar las jerarquías de ruta, no -iname
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
? ¡Porque puede no estar presente en el sistema! mientras find
, cp
siempre está en sus lugares. ¿O eres de gente que instaló 2 gigas de cosas para hacer cosas simples?
cp -r `ls -A | grep -v "c"` $HOME/
# $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
La forma más fácil que encontré, donde puedes copiar todos los archivos, excepto los archivos y carpetas, simplemente agregando sus nombres entre paréntesis:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
Ampliando el comentario de mvds , esto funciona para mí
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
Es relativo al directorio fuente.
Esto excluirá el directorio source/.git
de ser copiado.
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
y primero pruébelo con la opción -n para ver qué se va a copiar
Supongo que estás usando bash o dash. ¿Funcionaría esto?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
Hacer un ls excluyendo los archivos que no desea, y usar eso como el primer argumento para cp
ls
y simplemente hacerlo cp !(file1|file1) dest
.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
En realidad es bastante complicado. tiene que hacer múltiples pruebas para que funcione.
Digamos que usted quiere copiar /var/www/html
a /var/www/dev
, pero necesidad de excluir /var/www/html/site/video/
directorio tal vez debido a su tamaño. El comando sería:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
Algunas advertencias :
/
necesita la última barra diagonal en la fuente, de lo contrario, también copiará el directorio fuente en lugar de su contenido y se convertirá /var/www/dev/html/xxxx
, lo que tal vez no sea lo que desea.La --exclude
ruta es relativa a la fuente directamente. Incluso si pones la ruta absoluta completa, no funcionará.
-v
es detallado, -a
es para el modo de archivo, lo que significa que desea recurrencia y desea preservar casi todo.
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
Editar: olvidó excluir también la ruta de destino (de lo contrario, se copiaría recursivamente).
Esta es una modificación de la respuesta de Linus Kleen. Su respuesta no funcionó para mí porque habría un. agregado delante de la ruta del archivo que a cp no le gusta (la ruta se vería como fuente / .destination / file).
Este comando funcionó para mí:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
el comando --parents conserva la estructura del directorio.
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/
Simplemente muévalo temporalmente a un directorio oculto (y cámbiele el nombre después, si lo desea).
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
un shell POSIX estándar como sh
.
Utilizo un bucle "do while" para leer la salida del comando find. En este ejemplo, estoy haciendo coincidir (en lugar de excluir) ciertos patrones, ya que hay un número más limitado de coincidencias de patrones que quiero que no quiero. Puede revertir la lógica con un -no delante de las banderas -iname:
find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done
Utilizo lo anterior para copiar todos los archivos de tipo de música que son más nuevos en mi servidor que los archivos en un Western Digital TV Live Hub que he montado en / media / wd. Utilizo lo anterior porque tengo muchos archivos DVD, mpegs, etc. que quiero excluir Y porque por alguna razón parece que rsync se está copiando, pero después de mirar el dispositivo wd, los archivos no están ahí a pesar de que no errores durante el rsync con este comando:
rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
La primera parte ls
todos los archivos pero archivos específicos ocultos con bandera -I
. La salida de ls
se utiliza como entrada estándar para la segunda parte. xargs
construir y ejecutar comandos cp -rf -t destdir
desde la entrada estándar. la bandera-r
significa copiar directorios de forma recursiva, -f
significa copiar archivos a la fuerza que sobrescribirán los archivos en destdir
, -t
especifique la copia del directorio de destino.
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v