9

我需要备份我们服务器的所有目录层次结构,因此我需要列出服务器中某些目录的所有子目录。

问题是其中一个子目录包含数以万计的子目录(仅包含子目录名称的文件可能需要数百兆字节,并且相应的 find 命令需要很长时间)。

例如,如果我有一个目录 A 和一个子目录 A/a,其中包含上万个子目录,我想使用 find 命令列出 A 的所有子目录,不包括A/a 的所有子目录,但是不排除 A/a 本身

我使用这个问题中的答案尝试了 -prune 的许多变体,但无济于事。

有没有办法find在 UNIX 中使用该命令来执行此操作?

更新:

@devnull 的回答效果很好,但现在我遇到了另一个问题,所以我会稍微改进一下我的问题:

我使用了以下命令:

 find /var/www -type d \( ! -wholename "/var/www/web-release-data/*"  ! -wholename "/var/www/web-development-data/*" \)

出现的新问题是 find 由于某种原因仍在遍历 and 的整个目录树"/var/www/web-release-data/""/var/www/web-development-data/"因此它非常慢,我担心它可能需要几个小时。

有什么办法让 find 完全排除这些目录而不遍历它们各自的目录层次结构

4

5 回答 5

2

以下内容应该适合您:

find A -type d \( ! -wholename "A/a/*" \)

这将列出所有子目录,A包括A/a但不包括A/a.

例子:

$ mkdir -p A/{a..c}/{1..4}
$ find A -type d \( ! -wholename "A/a/*" \)
A
A/c
A/c/4
A/c/2
A/c/3
A/c/1
A/a
A/b
A/b/4
A/b/2
A/b/3
A/b/1
于 2013-09-10T15:43:33.227 回答
1

另一种解决方案:

find A \! -path "A/a/*"

如果您也不想要a,请使用

find A \! -path "A/a/*" -a \! -path "A/a"
于 2013-09-10T15:48:04.247 回答
0

你试过rsync(1)吗?它有一个--exclude=PATTERN在这里可能很好用的选项:

rsync -avz --exclude=A/a <source> <target>

使用 rsync 你不需要使用find(1)

于 2013-09-10T15:41:01.297 回答
0

要排除 2 个子目录:

find . -type d ! -wholename "dir/name/*" -a ! -wholename "dir/name*"
于 2013-09-10T16:09:07.797 回答
0

要回答您更新的问题,您可以这样做

find /var/www -wholename "/var/www/web-release-data/*" -o -wholename "/var/www/web-development-data/*" -prune -o -type d -print
于 2013-09-10T19:51:47.367 回答