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

11 浏览
0 Comments

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

我想复制目录中除特定子目录中的某些文件以外的所有文件。

我注意到cp命令没有--exclude选项。

那么,我该如何实现这个目标呢?

admin 更改状态以发布 2023年5月24日
0
0 Comments

如果要在每个类Unix文件工具(如cp、mv、rm、tar、rsync、scp等)中执行特定文件名模式的排除,就会产生巨大的重复工作。相反,这些操作可以作为 Globbing 的一部分在shell中完成。

bash

man 1 bash/ extglob

例如:

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

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

zsh

man 1 zshexpn/ filename generation

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

% setopt EXTENDED_GLOB
% echo images/*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/*~*.jpg
images/004.bmp images/2252.png

所以,x~y匹配模式x,但排除模式y。同样,有关完整细节,请参阅man页面。


fishnew!

fish shell 对此有一个更漂亮的答案

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

额外提示

键入 cp *,按下 CtrlX* 然后看看会发生什么。我保证它不会有害

0
0 Comments

rsync 是快捷而简单的:

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

您可以多次使用 --exclude

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

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

另外,您可以添加 -n 来进行干运行,查看将要被复制的内容,确定一切无误后,从命令行中删除 -n 进行实际操作。

0