特定の名前のディレクトリを見つける方法は?ただし、そのディレクトリが特定の名前を持つ別のディレクトリ内にある場合にのみ可能ですか?たとえば、次のようなディレクトリ構造がある場合
a
├── b
│ └── e
├── c
│ └── e
└── d
「e」ディレクトリを探したいが、そのディレクトリが「c」というディレクトリにある場合にのみ可能です。可能であれば、grepなしでfindコマンドのみを使用してください。
答え1
GNUを使用してフルパスから一致を検索しますfind
。-path
$ find . -path '*/c/e'
./a/c/e
e
これは、名前付きディレクトリ内のすべてのファイルまたはディレクトリと一致しますc
。
find
または、GNUまたは他のサポートされているものがない場合は、-path
次のことができます。
$ find . -type d -name c -exec find {} -name e \;
./a/c/e
ここでの秘密は、まずすべてのc/
ディレクトリを探し、次にそのディレクトリに名前を付けますe
。
答え2
Bashにタグを付けたので、もう1つのアプローチは次のものを使用することです。グローバルスター:
shopt -s globstar # Sets globstar if not already set
# Print the matching directories
echo **/c/e/
# Or put all matching directories in an array
dirs=(**/c/e/)
答え3
@terdonのソリューションに加えて、GNUを見つけることができない人のためにここに代替バージョンを提供しました(彼のアイデアに従う必要がありました!)。
find . -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null
これは私のコンピュータで動作するようです
テストするには:
# add files under each directories as otherwise some solutions would
# list also files under any "c/e" subdirs ...
# in a subdir : do :
mkdir -p a b c a/b a/c a/c/e a/c/d/e a/c/d/e/c/e/f/g
for i in $(find */ -type d -ls); do ( cd "$i" && touch a b c d e ) ; done
# this will creates several files under each subdirs, wherever it can (ie, when they don't match a subdir's name).
# then test:
find . -type d -name 'c' -exec find '{}/e' -type d \( -name 'e' -ls -o -prune \) \; 2>/dev/null
# and it answers only the 2 matching subdirs that match name "c/e":
inode1 0 drwxr-xr-x 1 uid gid 0 nov. 2 17:57 ./a/c/e
inode2 0 drwxr-xr-x 1 uid gid 0 nov. 2 18:02 ./a/c/d/e/c/e