Estoy tratando de escribir un script bash simple que copiará todo el contenido de una carpeta incluyendo archivos y carpetas ocultos en otra carpeta, pero quiero excluir ciertas carpetas específicas. ¿Cómo podría lograr esto?Copiar carpeta recursivamente, excluyendo algunas carpetas
Respuesta
uso rsync:
rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
cuenta que el uso source
y source/
son diferentes. Una barra inclinada significa copiar el contenido de la carpeta source
en destination
. Sin la barra al final, significa copiar la carpeta source
en destination
.
Alternativamente, si tiene muchos directorios (o archivos) para excluir, puede usar --exclude-from=FILE
, donde FILE
es el nombre de un archivo que contiene archivos o directorios para excluir.
--exclude
también pueden contener comodines, como --exclude=*/.svn*
note 'path1/to/exclude' etc. son un subdirectorio de "fuente". – abe
Si usted, como yo, desea copiar recursivamente una estructura completa y solo conservar un cierto tipo de archivos, también puede usar rsync: rsync -rav --include = */--include = "* .txt" - -exclude = * test/mytest Esto tomará todos los archivos .txt del directorio de origen y los copiará al directorio de destino con la estructura intacta. – slott
Sugiero agregar el --dry-run para verificar qué archivos se van a copiar. – loretoparisi
Similar a la idea de Jeff (no probado):
find . -name * -print0 | grep -v "exclude" | xargs -0 -I {} cp -a {} destination/
EXCLUDE="foo bar blah jah"
DEST=$1
for i in *
do
for x in $EXCLUDE
do
if [ $x != $i ]; then
cp -a $i $DEST
fi
done
done
No comprobado ...
puede utilizar el alquitrán, con la opción --exclude, y luego descomprimirlo en destino. por ejemplo
cd /source_directory
tar cvf test.tar --exclude=dir_to_exclude *
mv test.tar /destination
cd /destination
tar xvf test.tar
ver la página del manual de alquitrán para obtener más información
uso de alquitrán junto con un tubo.
cd /source_directory
tar cf - --exclude=dir_to_exclude . | (cd /destination && tar xvf -)
Incluso puede utilizar esta técnica en ssh.
¿No debería haber un punto antes de la tubería? Es decir, "tar cf - --exclude = dir_to_exclude. |" ... –
Correcto, actualizado. –
@Kyle Butt, cuando googleo, digo que usamos tar para convertir un grupo de archivos en un archivo, entonces, ¿cómo funciona esto para copiar la carpeta? ¿Puedes explicarlo? Intento este código, funciona perfectamente, pero necesito un buen entendimiento en este comando. – acer
Puede utilizar find
con la opción -prune
.
Un ejemplo de man find
:
cd /source-dir find . -name .snapshot -prune -o \(\! -name *~ -print0 \)| cpio -pmd0 /dest-dir This command copies the contents of /source-dir to /dest-dir, but omits files and directories named .snapshot (and anything in them). It also omits files or directories whose name ends in ~, but not their con‐ tents. The construct -prune -o \(... -print0 \) is quite common. The idea here is that the expression before -prune matches things which are to be pruned. However, the -prune action itself returns true, so the following -o ensures that the right hand side is evaluated only for those directories which didn't get pruned (the contents of the pruned directories are not even visited, so their contents are irrelevant). The expression on the right hand side of the -o is in parentheses only for clarity. It emphasises that the -print0 action takes place only for things that didn't have -prune applied to them. Because the default `and' condition between tests binds more tightly than -o, this is the default anyway, but the parentheses help to show what is going on.
Apoyos para localizar un ejemplo muy relevante directamente desde una página de manual. –
inspirado por la respuesta de @ SteveLazaridis, que fracasaría, aquí es una función de shell POSIX - sólo copiar y pegar en un archivo denominado cpx
en yout $PATH
y hacer que executible (chmod a+x cpr
). [La fuente ahora se mantiene en mi GitLab.
#!/bin/sh
# usage: cpx [-n|--dry-run] "from_path" "to_path" "newline_separated_exclude_list"
# limitations: only excludes from "from_path", not it's subdirectories
cpx() {
# run in subshell to avoid collisions
(_CopyWithExclude "[email protected]")
}
_CopyWithExclude() {
case "$1" in
-n|--dry-run) { DryRun='echo'; shift; } ;;
esac
from="$1"
to="$2"
exclude="$3"
$DryRun mkdir -p "$to"
if [ -z "$exclude" ]; then
cp "$from" "$to"
return
fi
ls -A1 "$from" \
| while IFS= read -r f; do
unset excluded
if [ -n "$exclude" ]; then
for x in $(printf "$exclude"); do
if [ "$f" = "$x" ]; then
excluded=1
break
fi
done
fi
f="${f#$from/}"
if [ -z "$excluded" ]; then
$DryRun cp -R "$f" "$to"
else
[ -n "$DryRun" ] && echo "skip '$f'"
fi
done
}
# Do not execute if being sourced
[ "${0#*cpx}" != "$0" ] && cpx "[email protected]"
Ejemplo de uso
EXCLUDE="
.git
my_secret_stuff
"
cpr "$HOME/my_stuff" "/media/usb" "$EXCLUDE"
- 1. Java copiar una carpeta excluyendo algunos archivos interno
- 2. Script Inno Setup para copiar carpetas
- 3. Excluyendo algunas teclas de XGrabKeyboard
- 4. cómo copiar entre carpetas y carpeta principal sin ruta completa
- 5. copiar la estructura de la carpeta sin las carpetas .svn
- 6. ¿Cómo puedo copiar recursivamente los contenidos del directorio usando Perl?
- 7. Copie el contenido de las carpetas anidadas en una carpeta recursivamente (terminal)
- 8. ¿Cómo copiar una carpeta, con exclusiones, con groovy nativo?
- 9. ¿Cómo puedo crear carpetas recursivamente en Delphi?
- 10. applescript para copiar carpetas en Xcode?
- 11. ¿Cómo puedo copiar carpetas usando sftp?
- 12. copiar carpetas en C# utilizando System.IO
- 13. Copiar archivos o directorios recursivamente en Python
- 14. Copiar carpeta usando Copiar-Elemento - comportamiento diferente
- 15. Spring MVC 3, Interceptor en todos excluyendo algunas rutas definidas
- 16. Cómo crear una función recursiva para copiar todos los archivos y carpetas
- 17. use comodín para copiar carpetas usando maven-assembly-plugin
- 18. Copiar varios archivos usando comodines/recursivamente usando Wix
- 19. ¿Cómo copiar archivos desde el árbol de carpetas dejando caer todas las carpetas con Robocopy?
- 20. ROBOCOPY - Copiar el contenido de las carpetas en una sola carpeta
- 21. ¿Cómo puedo copiar un directorio recursivamente y filtrar nombres de archivos en Perl?
- 22. En Windows, ¿hay una interfaz para copiar carpetas?
- 23. ¿Es posible crear carpetas recursivamente usando script de shell?
- 24. ¿Cómo encontrar archivos/carpetas recursivamente en Perl script?
- 25. ASP.net mvc 2 carpeta de carpetas estructura
- 26. Cómo copiar una estructura de directorios en ruby, excluyendo ciertas extensiones de archivos
- 27. ¿Cómo puedo copiar clonar/duplicar una carpeta en S3?
- 28. ¿Cómo puedo usar qmake para copiar archivos recursivamente?
- 29. Cómo copiar un archivo de una carpeta a otra carpeta
- 30. ¿Cómo puedo recursivamente quitar carpetas de sistema de seguimiento de mercurio
me imagino algo así como hallazgo. -name * canalizado a grep/v "exclude-pattern" para filtrar los que no desea y luego canaliza a cp para hacer la copia. –
Estaba tratando de hacer algo así, pero no pude entender cómo usar cp con una tubería – trobrock
Esto probablemente debería ir a un súper usuario. El comando que estás buscando es xargs. También podría hacer algo así como dos alquitrán conectados por una tubería. –