我在备份脚本中写了下面这行代码,但它并没有递归复制所有目录,而是获取文件,但只是将它们全部集中在一起。谁能告诉我这有什么问题?
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 将递归复制当前目录,仅添加指定的文件(非执行文件)。这将防止额外的写入/删除。