cp命令应该忽略一些文件

Nic*_*ilt 35 shell command-line

有时我需要执行以下命令

cp -rv demo demo_bkp
Run Code Online (Sandbox Code Playgroud)

但是我想忽略目录.git中的所有文件.我如何实现这一目标?复制.git文件需要很长时间,我不需要这些文件.

Dav*_*d Z 86

要具体忽略git目录,我先试试git export.

但一般来说,要复制不包含某些文件或文件夹的目录树,我建议使用rsync而不是cp.语法是几乎相同,但rsync办法更多的选项,其中包括一个以排除选定的文件:

rsync -rv --exclude=.git demo demo_bkp
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见手册页.


Joh*_*ica 8

好.振作起来.这不漂亮.

find demo -depth -name .git -prune -o -print0 | cpio -0pdv --quiet demo_bkp
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

  1. find demo | cpio -p demo_bkp 找到符合您想要的任何条件的文件,并使用cpio复制它们(所谓的"传递"模式).

  2. find -depth 更改文件打印的顺序以匹配cpio想要的顺序.

  3. find -name .git -prune告诉发现不要递归.git目录.

  4. find -print0 | cpio -0找到使用NUL字符(\0)来分隔文件名.这是为了在有任何带有空格,换行符或其他异常字符的奇怪命名文件的情况下获得最大的稳健性.

  5. cpio -d 根据需要创建目录.

  6. cpio -v --quiet 打印每个文件名,同时省略"X块复制"消息,cpio通常在结尾打印.


Lat*_*SuD 5

我认为这可以解决问题:

cd demo
find . -not -path \*/.\* -type d -exec mkdir -p -- ../demo_bkp/{} \;
find . -not -path \*/.\* -type f -exec cp -- {} ../demo_bkp/{} \;
Run Code Online (Sandbox Code Playgroud)

首先找到并创建每个目录。然后找到并复制每个文件。

请注意,它不适用于特殊文件(符号链接等)。