9

サーバーのすべてのディレクトリ階層をバックアップする必要があるため、サーバー内のいくつかのディレクトリのすべてのサブディレクトリを一覧表示する必要があります。

問題は、これらのサブディレクトリの 1 つに数万のサブディレクトリが含まれていることです (サブディレクトリの名前だけのファイルは数百メガバイトかかり、それぞれの検索コマンドに非常に長い時間がかかります)。

たとえば、ディレクトリ A と、数万のサブディレクトリを含む 1 つのサブディレクトリ 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 がまだ"/var/www/web-release-data/"andのディレクトリ ツリー全体をトラバースしているため"/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 に答える
0

2 つのサブディレクトリを除外するには:

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