cp 命令从复制中排除某些文件

Ste*_*cob 55 command-line bash cp

有没有办法使用命令“cp”来复制目录并排除其中的某些文件/子目录?

saj*_*i89 82

使用rsync

rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Run Code Online (Sandbox Code Playgroud)

注意使用sourcesource/是不同的。尾部斜杠表示将文件夹的内容复制sourcedestination. 没有尾部斜杠,这意味着将文件夹源复制到destination.

或者,如果您要排除大量目录(或文件),则可以使用--exclude-from=FILE, 其中FILE是包含要排除的文件或目录的文件的名称。

--exclude 也可能包含通配符,例如 --exclude=*/.svn*

复制自: https : //stackoverflow.com/a/2194500/749232

如果你想使用cp它自己:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Run Code Online (Sandbox Code Playgroud)

这假设目标目录结构与源目录结构相同。

复制自: https : //stackoverflow.com/a/4586025/749232

  • “复制文件夹的内容...”中的“内容”一词是理解该句子的主要关键字。它应该加粗并突出显示。 (2认同)

xen*_*oid 9

游戏后期,但这里有一个使用普通 bash 和 cp 的非常不同的解决方案:您可以使用全局文件规范,同时忽略一些文件。

假设目录包含以下文件:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3
Run Code Online (Sandbox Code Playgroud)

使用GLOBIGNORE变量:

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4
Run Code Online (Sandbox Code Playgroud)

或者有更具体的排除:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3
Run Code Online (Sandbox Code Playgroud)

或使用否定匹配

$ ls !(unlisted*)
listed1  listed2  listed3  listed4
Run Code Online (Sandbox Code Playgroud)

这也支持几种不匹配的模式:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3
Run Code Online (Sandbox Code Playgroud)

  • 对于负匹配,您需要启用扩展 globs:`shopt -s extglob`,也不需要导出 `GLOBIGNORE`:它应该修改当前 shell 的行为,大多数子程序不会关心它. (2认同)