findコマンドで最小深度を選択的に適用できますか?

findコマンドで最小深度を選択的に適用できますか?

次のファイル階層があります。

data
├── debug.log
├── messages
│   ├── msg001.txt
│   ├── msg002.txt
│   └── msg003.txt
└── pictures
    ├── msg002
    │   └── pic001.jpg
    └── msg003
        ├── pic001.jpg
        └── pic002.jpg

最初の2つのレベル(データ、データ/メッセージ、データ/画像)の下のすべてのファイルとすべてのディレクトリを見つけたいです。階層の固定構造の一部ではないすべて(該当する場合)。

シングル検索呼び出しでこれを実行できますか?

次のファイルがあります。

$ find data -type f | sort
data/debug.log
data/messages/msg001.txt
data/messages/msg002.txt
data/messages/msg003.txt
data/pictures/msg002/pic001.jpg
data/pictures/msg003/pic001.jpg
data/pictures/msg003/pic002.jpg

ディレクトリを見つけることができます:

$ find data -mindepth 2 -type d | sort
data/pictures/msg002
data/pictures/msg003

ただし、-minlengthはテストではなくオプションなので、それらを組み合わせることはできません。

$ find data -type f -o \( -mindepth 2 -type d \) | sort
find: warning: you have specified the -mindepth option after a non-option argument -type, but options are not positional (-mindepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

data/messages/msg001.txt
data/messages/msg002.txt
data/messages/msg003.txt
data/pictures/msg002
data/pictures/msg002/pic001.jpg
data/pictures/msg003
data/pictures/msg003/pic001.jpg
data/pictures/msg003/pic002.jpg

(data/debug.logはここにありません。)

階層の深さを実際のテストと見なす方法はありますか?

私が考えることができる最高の組み合わせは、パスで正規表現を使用してディレクトリの最初の2つのレベルを識別することです。

$ find data -type f -o \( -type d -regextype posix-extended \! -regex 'data(/[^/]+)?' \) | sort

ベストアンサー1

階層の深さを実際のテストと見なす方法はありますか?

にありますFreeBSDを探す-depth N条件もあります:

% find data -type f -o -depth +1 -type d |sort
data/debug.log
data/messages/msg001.txt
data/messages/msg002.txt
data/messages/msg003.txt
data/pictures/msg002
data/pictures/msg002/pic001.jpg
data/pictures/msg003
data/pictures/msg003/pic001.jpg
data/pictures/msg003/pic002.jpg

(はい、-depthそのオプションと混同しやすいです。)

「固定構造」(IMO、構造が実際に固定されているかどうかを知る必要があります)の一部であるディレクトリのセットを知っている場合は、次のディレクトリを除外できます。

% find data ! -path data ! -path data/messages ! -path data/pictures
...

またはgrepと同じです。

% find data | grep -vEe '^(data|data/(pictures|messages))$'
...

find(代わりにデフォルトの出力形式を使用したため、find -print0ファイル名に改行文字が含まれていない可能性があります)

おすすめ記事