cp 命令用于排除某些文件的复制

cp 命令用于排除某些文件的复制

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

答案1

使用rsync

rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

请注意,使用sourcesource/是不同的。尾部斜杠表示复制内容文件夹的 复制sourcedestination。如果没有尾随斜杠,则表示将文件夹源复制到destination

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

-av表示存档模式和详细模式。

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

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

如果你想使用cp它本身:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

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

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

答案2

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

假设目录包含以下文件:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3

使用格洛比格诺尔多变的:

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4

或者更具体的排除:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3

或者使用否定匹配

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

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

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3

答案3

快速开始

跑步:

rsync -av --exclude='path1/in/source' --exclude='path2/in/source' [source]/ [destination]

笔记

  • -avr将创建一个名为 的新目录[destination]
  • sourcesource/产生不同的结果:
    • source/— 复制内容将源位置转换至目标位置。
    • source— 复制文件夹源到目的地。
  • 要排除多个文件:
    • --exclude-from=FILEFILE是包含要排除的其他文件或目录的文件的名称。
  • --exclude也可能包含通配符:
    • 例如--exclude=*/.svn*

修改自:https://stackoverflow.com/a/2194500/749232


例子

起始文件夹结构:

.
├── destination
└── source
    ├── fileToCopy.rtf
    └── fileToExclude.rtf

跑步:

rsync -av --exclude='fileToExclude.rtf' source/ destination

结束文件夹结构:

.
├── destination
│   └── fileToCopy.rtf
└── source
    ├── fileToCopy.rtf
    └── fileToExclude.rtf

答案4

每个人似乎都回答“使用 rsync”,虽然我同意这是一个非常强大的工具,但它也有些过度,并且存在一些风险。原帖者问如何使用,cp我发现结合其他人提出的一些建议,这种方法很有效。

cp -rf !(backup) backup/

这是一个简单的实验,将目录中的所有文件复制到同一目录中名为备份的文件中,而不必cp担心跳过递归调用。希望这对您有所帮助。

相关内容