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 --excludemúltiples veces.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
Tenga en cuenta que el directorio thefoldertoexcludedespués de --excludela opción es relativa a la sourcefolder, es decir, sourcefolder/thefoldertoexclude.
También puede agregar -npara la ejecución en seco para ver qué se copiará antes de realizar una operación real, y si todo está bien, elimínelo -nde la línea de comandos.
--exclude
thefoldertoexcludeCuál es el relativo al sourcefolderdirectorio 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_GLOBy 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~ycoincide 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
zshaunque funciona.
setopt -u extglob.
¿Por qué usar rsynccuando 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.
-pathargumento 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, cpsiempre 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/.gitde 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
lsy simplemente hacerlo cp !(file1|file1) dest.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsyncEn realidad es bastante complicado. tiene que hacer múltiples pruebas para que funcione.
Digamos que usted quiere copiar /var/www/htmla /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 --excluderuta es relativa a la fuente directamente. Incluso si pones la ruta absoluta completa, no funcionará.
-ves detallado, -aes 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
cpun 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 lstodos los archivos pero archivos específicos ocultos con bandera -I. La salida de lsse utiliza como entrada estándar para la segunda parte. xargsconstruir y ejecutar comandos cp -rf -t destdirdesde la entrada estándar. la bandera-r significa copiar directorios de forma recursiva, -fsignifica copiar archivos a la fuerza que sobrescribirán los archivos en destdir, -tespecifique la copia del directorio de destino.
cp -r ls -A | grep -v "Excluded_File_or_folder"../$target_location -v