【问题标题】:Copy whole directory but exclude all folders and subfolders with certain name复制整个目录,但排除具有特定名称的所有文件夹和子文件夹
【发布时间】:2021-12-23 12:41:33
【问题描述】:

我不允许在我正在处理的集群上使用 rsync,所以我需要使用 cp。我想复制一个大目录,包括所有文件和子文件夹等,但没有任何名为“outdir”的文件夹。 我试过cp -r -v ./!(outdir) ../target-directory/ 但它仍会复制名称为 outdir 的更深目录中的所有文件夹和内容。它只包含最高目录中的 outdir 文件夹。

我也尝试过cp -r ./*/!(outdir) ../target-directory/,但是那个人将所有文件复制到文件夹中,而没有保留任何层次结构或文件夹等。

我也尝试了某些查找命令,但没有成功,但也许我只是在做一些愚蠢的事情。我是 bash 的初学者,所以如果你能解释你的答案以及标志等的作用,那真的很有帮助,我现在一直在尝试,我认为不应该那么难做。

【问题讨论】:

  • 你提前执行shopt -s extglob了吗?
  • 您的outdir 目录可以出现在层次结构中的任何级别吗?如果是这样,那么您应该安装自己的 rsync 副本,IMO。
  • 是的,它们可以出现在各个级别,是的,我做了 shopt -s extglob
  • 关于如何安装我自己的副本的任何链接/建议?
  • 什么操作系统会运行rsync 命令?

标签: bash unix cp


【解决方案1】:

除了cp,您可以使用tar 和选项--exclude 来控制您想要复制的内容。

完整的命令是:

tar --exclude="outdir" -cvpf - . | (cd TARGET_DIRECTORY; tar -xpf -)
  • 因此,任何包含“outdir”模式的路径都将被排除。
  • 如果没有 --exclude 选项,它将复制 TARGET_DIRECTORY 下当前目录的整个结构。
  • 您可以将第一个 tar 中的 . 替换为所需的源目录。

【讨论】:

  • 这也适用于排除文件名吗?所以如果我把“文件名”而不是“outdir”放在复制过程中,所有名为“文件名”的文件都会被忽略吗?
  • 是的。任何与 `--exclude`` 中定义的模式匹配的东西。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多