Аргумент -exec
для поиска просто выполняет эту команду для каждого возвращаемого элемента. Так, например, если у вас есть каталог, например:
>$ find .
.
./a.txt
./b.txt
./dir1
./dir1/c.txt
./dir2
./dir2/d.txt
Часть -exec
будет запускаться один раз для каждой строки, заменяя текст {}
.
Так что, в вашем случае, он будет рекурсивно копировать каждую запись в указанный каталог.
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
Кстати, вы также отмечаете -not -executable
. Это делает реальную разницу. Каталоги в Linux являются исполняемыми. (Бит выполнения для каталогов управляет разрешениями на просмотр содержимого каталога, так как папки не могут быть выполнены.)
>$ 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
Так,
>$ find . -not -executable
a.txt
b.txt
dir1/c.txt
dir2/d.txt
Не вернет никаких каталогов, только список неисполняемых файлов (-type f
). И, как было сказано, cp
копирует каждый из них по отдельности (поскольку рекурсивно можно копировать только каталоги) в /run/media/user/32GB/prog/
Потенциальное решение - сначала скопировать все, затем выполнить find
/rm
>$ cp -ruv . /run/media/user/32GB/prog/
>$ find /run/media/user/32GB/prog -executable -type f -exec rm {} \;
Или неприятный rsync
(я люблю rsync
):
>$ find . -type f -not -executable > /tmp/filelist
>$ rsync -r --include-from=/tmp/filelist . /run/media/user/32GB/prog/
rsync будет рекурсивно копировать текущий каталог, добавляя только указанные файлы - не-exec. Это предотвратит лишнюю запись / удаление.