Hacer una copia de seguridad de forma recursiva no es copiar directorios

Hacer una copia de seguridad de forma recursiva no es copiar directorios

Tengo la siguiente línea en un script para hacer una copia de seguridad y no copia recursivamente todos los directorios, obtiene los archivos pero simplemente los agrupa todos. ¿Alguien puede decirme qué tiene de malo?

find . -type f -not -executable -exec cp -ruv {} /run/media/user/32GB/prog/ \; 

Respuesta1

El -execargumento para buscar simplemente ejecuta ese comando en cada elemento devuelto. Entonces, por ejemplo, si tiene un directorio configurado como:

>$ find .
.
./a.txt
./b.txt
./dir1
./dir1/c.txt 
./dir2
./dir2/d.txt

La -execparte se ejecutará una vez por cada línea, sustituyendo el texto por {}. Entonces, en su caso, copiaría recursivamente cada entrada al directorio especificado.

cp -ruv a.txt /run/media/user/32GB/prog/
cp -ruv b.txt /run/media/user/32GB/prog/
cp -ruv dir1 /run/media/user/32GB/prog/
cp -ruv dir1/c.txt /run/media/user/32GB/prog/
etc, etc

Por cierto, también marcas -not -executable. Esto marca la verdadera diferencia. Los directorios en Linux son ejecutables. (El bit de ejecución en los directorios administra los permisos para enumerar el contenido del directorio, ya que las carpetas no se pueden ejecutar).

>$ ls -l
-rw-rw-r--.   1 user user     1583 Feb 10 13:14 a.txt
-rw-rw-r--.   1 user user     1583 Feb 10 13:14 b.txt
drwxr-xr-x.   2 user user     4096 Nov 22  2013 dir1
drwxr-xr-x.   2 user user     4096 Nov 22  2013 dir2

Entonces,

>$ find . -not -executable 
a.txt
b.txt
dir1/c.txt
dir2/d.txt

No devolverá ningún directorio, solo una lista de archivos no ejecutables ( -type f). Y, como se dijo, cpcopia todos y cada uno de ellos, individualmente (ya que sólo se pueden copiar directorios de forma recursiva) a/run/media/user/32GB/prog/

Una posible solución es copiar todo primero y luego hacer un find/rm

>$ cp -ruv . /run/media/user/32GB/prog/
>$ find /run/media/user/32GB/prog -executable -type f -exec rm {} \;

O un desagradable rsync(me encanta rsync):

>$ find . -type f -not -executable > /tmp/filelist
>$ rsync -r --include-from=/tmp/filelist . /run/media/user/32GB/prog/

rsync copiará el directorio actual de forma recursiva, agregando solo los archivos especificados (los no ejecutivos). Eso evitará la escritura/eliminación adicional.

información relacionada