ディレクトリを一覧表示しますが、サブディレクトリが含まれている場合にのみ適用されますか?

ディレクトリを一覧表示しますが、サブディレクトリが含まれている場合にのみ適用されますか?

Unixでは、1つのコマンドを使用してサブディレクトリを含むディレクトリのみを一覧表示できますか?

たとえば、「division_A」というサブディレクトリが含まれている場合は、ディレクトリ名を一覧表示したいと思います。

/data/data_file/form_100/division_A
/data/data_file/form_101/division_A
/data/data_file/form_102/division_A

予想される結果は次のとおりです。

form_100 
form_101 
form_102

2つのコマンドラインでのみ目標を達成できます。

cd /data/data_files
echo `ls -d */division_A 2> /dev/null | sed 's,/division_A,,g'`

だから誰かがコマンドを使ってこれを行うことができるかどうか尋ねたかったのです。

答え1

可能であれば、そのオプションを使用して、他のツールを呼び出さずに結果の親ディレクトリのみを印刷するように出力形式を指定GNU findできます。たとえば、次のようになります。-printfdirname

$ find
.
./data_file
./data_file/form_100
./data_file/form_100/division_A
./data_file/form_101
./data_file/form_101/division_A
./data_file/form_102
./data_file/form_102/division_A

$ find -type d -name 'division_A' -printf "%h\n"
./data_file/form_100
./data_file/form_101
./data_file/form_102

答え2

そしてzsh

print -rl -- **/division_A(:h:t)

答え3

ファイルシステムを解析する場合は、ls通常使用するのは良い考えではありません。findこの種の作業のために。

ディレクトリリストが空ではありません。

空でないディレクトリのリストが必要な場合は、次のコマンドを使用できます。

サンプル:

$ tree
.
|-- empty1
|-- empty2
|-- empty3
|-- full1
|   |-- division_A
|   |-- empty1
|   `-- full1
|       `-- afile
|-- full2
|   |-- division_A
|   |-- empty2
|   `-- full2
|       `-- afile
`-- full3
    |-- division_A
    |-- empty3
    `-- full3
        `-- afile

その後、次のコマンドを使用できます。

$  find . -mindepth 1 -not -empty -type d
./full3
./full3/full3
./full2
./full2/full2
./full1
./full1/full1

これはすべてのディレクトリのリストですいいえ空です。必要に応じて、awkこの出力を使用して整理できます。uniq

上記のコマンドのPOSIX互換バージョンは次のとおりです。

$ find  . -type d -exec sh -c '[ -n "$(ls -UA "$1/" )" ]' dummy {} \; \
      -print |grep -v '^.$'

ディレクトリのリスト。ディレクトリを含みます。部門_A

ただし、「division_A」を含むディレクトリのリストを探している場合は、次のfindコマンドを使用して検索できます。

$ find . -type d -name "division_A" -exec dirname {} \;|sort -u
./full1
./full2
./full3

必要に応じてここから出力をクリーンアップできますsed

$ find . -type d -name "division_A" -exec dirname {} \;| sed 's/\.\///' |sort -u
full1
full2
full3

答え4

そのディレクトリに CD をコピーする代わりに、次のコマンドを使用します。

echo `ls -d /data/data_files/*/division_A 2> /dev/null | sed 's,/division_A,,g'`

関連情報