Fazer backup recursivamente não está copiando os diretórios

0

Eu tenho a seguinte linha em um script para backup e ele não está recursivamente copiando todos os diretórios, ele obtém os arquivos, mas apenas os reúne todos juntos. Alguém pode me dizer o que está errado com isso?

find . -type f -not -executable -exec cp -ruv {} /run/media/user/32GB/prog/ \; 
    
por user341814 10.07.2014 / 04:07

1 resposta

3

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

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

A parte -exec será executada uma vez para cada linha, substituindo o texto por {} . Então, 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

Por acaso, você também marca -not -executable . Isso faz a diferença real. Diretórios no Linux são executáveis. (O bit de execução nos diretórios gerencia as permissões para listar o conteúdo do diretório, já que 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, cp copia todos e cada um deles, individualmente (desde que apenas diretórios podem ser copiados recursivamente) para /run/media/user/32GB/prog/

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

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

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

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

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

    
por 10.07.2014 / 04:22