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 -exec
argumento 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 -exec
parte 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, cp
copia 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.