Fazer backup recursivamente não é copiar diretórios

Fazer backup recursivamente não é copiar diretórios

Eu tenho a seguinte linha em um script para fazer backup e ele não copia recursivamente todos os diretórios, ele obtém os arquivos, mas apenas os agrupa. Alguém pode me dizer o que há de errado com isso?

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

Responder1

O -execargumento para encontrar simplesmente executa esse comando em cada item retornado. Então, por exemplo, se você tiver um diretório definido como:

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

A -execparte será executada uma vez para cada linha, substituindo o texto por {}. Portanto, no seu caso, ele copiaria recursivamente cada entrada para o diretório 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

Aliás, você também marca -not -executable. Isso faz a verdadeira diferença. Os diretórios no Linux são executáveis. (O bit de execução nos diretórios gerencia permissões para listar o conteúdo do diretório, pois as pastas não podem ser executadas.)

>$ 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

Então,

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

Não retornará nenhum diretório, apenas uma lista de arquivos não executáveis ​​( -type f). E, como foi dito, cpcopia cada um deles, individualmente (já que apenas diretórios podem ser copiados recursivamente) para/run/media/user/32GB/prog/

Uma solução potencial é copiar tudo primeiro e depois fazer um find/rm

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

Ou uma desagradável rsync(eu amo rsync):

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

O rsync copiará o diretório atual recursivamente, adicionando apenas os arquivos especificados - os não executivos. Isso impedirá a gravação/exclusão extra.

informação relacionada