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.