Estoy tratando de escribir un script bash simple que copiará todo el contenido de una carpeta, incluidos los archivos y carpetas ocultos en otra carpeta, pero quiero excluir ciertas carpetas específicas. ¿Cómo podría lograr esto?
197

cp -R !(dir1|dir2) path/to/destination!(dir1|dir2)patrón debeextglobestar activado (shopt -s extglobpara activarlo).Respuestas:
Use rsync:
Tenga en cuenta que el uso
sourceysource/son diferentes. Una barra diagonal significa copiar el contenido de la carpetasourceendestination. Sin la barra inclinada final, significa copiar la carpetasourceendestination.Alternativamente, si tiene muchos directorios (o archivos) para excluir, puede usar
--exclude-from=FILE, dondeFILEestá el nombre de un archivo que contiene archivos o directorios para excluir.--excludetambién puede contener comodines, como--exclude=*/.svn*fuente
rsync -av --exclude='.git/' ../old-repo/ .Use alquitrán junto con una pipa.
Incluso puedes usar esta técnica en ssh.
fuente
Puedes usar
findcon la-pruneopción.Un ejemplo de
man find:cd / dir-fuente encontrar . -name .snapshot -prune -o \ (\! -name * ~ -print0 \) | cpio -pmd0 / dest-dir Este comando copia el contenido de / source-dir a / dest-dir, pero omite archivos y directorios llamados .snapshot (y cualquier cosa en ellos). También omite archivos o directorios cuyo nombre termina en ~, pero no su con‐ carpas La construcción -prune -o \ (... -print0 \) es bastante común. los idea aquí es que la expresión antes de -prune coincide con cosas que son ser podado Sin embargo, la acción -prune en sí misma devuelve verdadero, por lo que el siguiente -o asegura que el lado derecho se evalúe solo para aquellos directorios que no fueron podados (el contenido de los podados los directorios ni siquiera se visitan, por lo que su contenido es irrelevante). La expresión en el lado derecho de -o está solo entre paréntesis para mayor claridad. Hace hincapié en que la acción -print0 solo tiene lugar para cosas que no tenían - se aplicó la ciruela. Porque el la condición predeterminada `y 'entre pruebas se une más estrechamente que -o, esto es el valor predeterminado de todos modos, pero los paréntesis ayudan a mostrar lo que está sucediendo en.fuente
cpioaún no se ha empaquetado para MSYS2.puede usar tar, con la opción --exclude, y luego descomprimirlo en el destino. p.ej
vea la página de manual de tar para más información
fuente
Similar a la idea de Jeff (no probado):
fuente
/usr/share/iconse inmediatamente llegué afind: paths must precede expression: 22x22donde este es uno de los subdirectores allí . Mi comando fuefind . -name * -print0 | grep -v "scalable" | xargs -0 -I {} cp -a {} /z/test/(es cierto que estoy en MSYS2, así que realmente/mingw64/share/icons/Adwaita, pero no puedo ver cómo esto es culpa de MSYS2)No probado ...
fuente
inspirado en la respuesta de @ SteveLazaridis, que fallaría, aquí hay una función de shell POSIX: simplemente copie y pegue en un archivo nombrado
cpxen usted$PATHy hágalo ejecutable (chmod a+x cpr). [La fuente ahora se mantiene en mi GitLab .Ejemplo de uso
fuente