递归备份不是复制目录

递归备份不是复制目录

我在备份脚本中写了下面这行代码,但它并没有递归复制所有目录,而是获取文件,但只是将它们全部集中在一起。谁能告诉我这有什么问题?

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

答案1

find 的参数-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 将递归复制当前目录,仅添加指定的文件(非执行文件)。这将防止额外的写入/删除。

相关内容