如何使用“cp”命令来排除特定目录?
如何使用“cp”命令来排除特定目录?
我想复制目录中除特定子目录中的某些文件以外的所有文件。
我注意到cp
命令没有--exclude
选项。
那么,我该如何实现这个目标呢?
admin 更改状态以发布 2023年5月24日
如果要在每个类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!
cp (string match -v '*.excluded.names' -- srcdir/*) destdir
额外提示
键入 cp *
,按下 CtrlX* 然后看看会发生什么。我保证它不会有害
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
进行实际操作。