假设我有一个如下的目录结构:
main folder
sub directory
sub2 directory
我想避免在从 复制时复制特定目录或文件main folder
。
我在网上查找并找到了一种方法,但他们使用了类似的东西:
rsync -av --progress --exclude='logdir'
我不想转到尺寸并复制。我使用如下命令:
cp -i -r source destination
我这样做是因为覆盖保护。
那么,如何从主目录复制时排除某些目录或文件?
答案1
单程是从内部运行这个main folder
:
find -maxdepth 1 -type d ! -name "dir" ! -path . -exec cp -i -r {} /path/to/destination/ \;
- 更改
dir
为要排除的目录的名称。 /path/to/destination/
随目标目录的路径改变。
其他方式是添加这样的自定义函数:
mycp () {
for f in "$1"*
do
grep -qwv "$3" <(echo "$f") && \
cp -i -r "$f" "$2"
done
}
~/.bashrc
然后到你的source
文件或者关闭并重新打开你的终端。
然后你可以像这样使用它:
mycp "/path/to/source/" "/path/to/destination/" "dir"
- 更改
/path/to/source/
为源目录的路径。它必须以 结尾/
。 - 更改
/path/to/destination/
为目标目录的路径。它必须以 结尾/
。 - 更改
dir
为要排除的目录的名称。
使用扩展通配符方式的 Bash 模式匹配(小心):
带有扩展通配符的 Bash 模式匹配是一种选项。
我之所以添加这个是因为@bac0n在评论中提到了这一点。这种 bash 模式匹配需要启用扩展通配符,但默认情况下不启用该通配符... 简单通配符默认情况下已启用,但无法与此配合使用... 我不想建议新贡献者/简单用户启用和使用扩展通配符,尤其是在文件操作中。
扩展通配符本质上并不比简单通配符更危险。但是,用户可能拥有他们最初从互联网上复制和粘贴的脚本和 bash 代码,并且其中包含一些扩展通配符模式……当用户启用扩展通配符时,它们的行为可能会有所不同,如果这些脚本/代码处理文件操作,这可能会造成破坏。有经验的用户应该能够注意到差异,但初学者可能不会。
无论如何,要使用它,您需要先启用 bash 的扩展通配符功能,如下所示:
shopt -s extglob
cp
然后像这样使用:
cp -i -r source/!(name of directory to execlude) destination/
更多信息,请参阅Bash 扩展通配符