如何使用“cp”命令排除特定目录?

新手上路,请多包涵

我想复制目录中的所有文件,但特定子目录中的某些文件除外。我注意到 cp 命令没有 --exclude 选项。那么,我该如何实现呢?

原文由 David Liu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.4k
2 个回答

rsync 快速简单:

 rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

您可以多次使用 --exclude

 rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

请注意,在 --exclude 选项之后的目录 thefoldertoexclude 是相对于 sourcefolder ,即 —44b727286915e01— ,即 sourcefolder/thefoldertoexclude

您也可以添加 -n 进行空运行以查看在执行实际操作之前将复制的内容,如果一切正常,请从命令行中删除 -n

原文由 hank 发布,翻译遵循 CC BY-SA 4.0 许可协议

好吧,如果每个 unix-ish 文件实用程序(如 cp、mv、rm、tar、rsync、scp、…)都必须排除某些文件名模式,就会产生巨大的重复劳动。相反,这些事情可以作为 globbing 的一部分来完成,即通过你的 shell。

重击

man 1 bash , / extglob

例子:

$ shopt -s extglob
$ 回声图像/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(*.jpg)
图像/004.bmp 图像/2252.png

所以你只需在 !() 里面放一个模式,它就会否定匹配。该模式可以任意复杂,从枚举单个路径(如 Vanwaril 在另一个答案中所示)开始: !(filename1|path2|etc3) ,到带有星号和字符类的类似正则表达式的东西。有关详细信息,请参阅手册页。

zsh

man 1 zshexpn , / 文件名生成

您可以执行 setopt KSH_GLOB 并使用类似 bash 的模式。或者,

% setopt EXTENDED_GLOB
% 回声图像/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% 回显图像/*~*.jpg
图像/004.bmp 图像/2252.png

所以 x~y 匹配模式 x ,但不包括模式 y 。再一次,有关完整的详细信息,请参阅联机帮助页。


鱼新!

鱼壳 对此有一个 更漂亮的答案

🐟 cp (string match -v '*.excluded.names' -- srcdir/*) destdir


奖金专业提示

键入 cp *按 Ctrl X * 看看会发生什么。我保证这没有害处

原文由 ulidtko 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题