次のディレクトリセットがあります。
/level1/user01/dir01
/level1/user01/dir02
/level1/user01/dir03
/level1/user01/dir04
/level1/user02/dir01
/level1/user02/dir02
/level1/user02/dir03
/level1/user02/dir04
/level1/user03/dir01
/level1/user03/dir02
/level1/user03/dir03
/level1/user03/dir04
findを使用して、各ユーザーのdir02ディレクトリから拡張子が.ozのファイルを検索したいと思います。
私は利用できる
find /level1/ -name "*.oz"
しかし、dir02ディレクトリ内でのみ検索したいと思います。
これはうまくいきません
find /level1/"[a-z][0-9]"/dir02 -name "*.oz"
答え1
最初の引数に複数のディレクトリを指定する場合は、シェルによって異なります。したがって、bashとzsh、および同様のもの(cshとtcsh?)ではシェルグローブのみを使用します。シェルはこのglobを興味のあるディレクトリに拡張し、複数のfind
引数を使用できるようにします。
find /level1/*/dir02 -name "*.oz"
いくつかの追加:
- ここで構文は正規表現ではなくglobです。
- とにかく正規表現が間違っています。 (引用を無視)でなければなりません
/level1/[a-z]*[0-9]*/dir02
。 sに注意してください*
。 - 別のオプションはです
-path
。man find
しかし、これは単にシェルグロブを使用するよりも複雑です。
答え2
find
以下を使用する代替ソリューション-path
:
$ find /level1 -type f -path "/level1/user??/dir02/*.oz" -print
これにより、(フル)パスが一致するすべての一般ファイルのパスが印刷されます/level1/user??/dir02/*.oz
。
dir02
ファイルがそのディレクトリ(サブディレクトリではない)にあることがわかっている場合は、そのファイルが一覧表示されます。
printf '%s\n' /level1/user??/dir02/*.oz