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