У меня есть следующая строка в скрипте для резервного копирования, и он не рекурсивно копирует все каталоги, он получает файлы, а просто объединяет их все вместе. Может кто-нибудь сказать мне, что с ним не так?

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

1 ответ1

3

Аргумент -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. Это предотвратит лишнюю запись / удаление.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .