从主目录复制时如何避开某些目录或文件?

从主目录复制时如何避开某些目录或文件?

假设我有一个如下的目录结构:

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 扩展通配符

相关内容