我想复制目录中的所有文件,但特定子目录中的某些文件除外。我注意到 cp
命令没有 --exclude
选项。那么,我该如何实现呢?
原文由 David Liu 发布,翻译遵循 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)
,到带有星号和字符类的类似正则表达式的东西。有关详细信息,请参阅手册页。
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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答795 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
rsync
快速简单:您可以多次使用
--exclude
。请注意,在
--exclude
选项之后的目录thefoldertoexclude
是相对于sourcefolder
,即 —44b727286915e01— ,即sourcefolder/thefoldertoexclude
您也可以添加
-n
进行空运行以查看在执行实际操作之前将复制的内容,如果一切正常,请从命令行中删除-n
。