ツリーの最下部に到達するコマンド


1

一番下のディレクトリのファイルパスを返すLinuxコマンドがありますか。

次のコマンドを試しました。 find /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/ -type d

そして

tree -dfi /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/

これらのコマンドは両方とも返します:

/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/generic
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/admin
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/logandnetworkactivity
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm/a
/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/reports

あなたが見ることができるように:

/home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm

    /home/Alison/workspace/DirLevel1/DirLevel2/DirLevel3/DirLevel4/DirLevel5/DirLevel6/DirLevel7/qvm/a

私はちょうど一番下のディレクトリが欲しいだけで/qvm/なく、戻ってきてい/qvm/aます。


1
同じ深さに複数のパスがある場合はどうなりますか?両方が必要ですか、それとも1つだけですか?
thkala

回答:


3

これは仕事をするはずです:

find . -type d | \
  awk -F/ '
    NF <= old_NF {print prev}
    {old_NF=NF; prev=$0}
    END {print $0}
  '

例:

find . -type d
.
./backup
./source
./source/siteA
./source/siteA/regionA
./source/siteA/regionA/files
./source/siteA/regionB
./source/siteA/regionB/files
./source/siteA/regionD
./source/siteA/regionD/files
./source/siteA/regionC
./source/siteA/regionC/files
./source/dir with space
./source/siteB
./source/siteB/regionA
./source/siteB/regionA/files
./source/siteB/regionB
./source/siteB/regionB/files

今、上記のコマンドは以下を提供します:

./backup
./source/siteA/regionA/files
./source/siteA/regionB/files
./source/siteA/regionD/files
./source/siteA/regionC/files
./source/dir with space
./source/siteB/regionA/files
./source/siteB/regionB/files

簡単な説明:

プレーンfind . -type d出力は、ディレクトリ構造に従ってすでにソートされています。現在必要なのは、同じ深さまたはそれ以下の深さのラインのすぐ前にあるライン(=パス)です。そして最後の行(常に)。

これがawkコマンドの機能です。入力行をパスセパレーター(-F/)で分割し、フィールドの数と行を保存し({old_NF=NF; prev=$0})、古いフィールドの数と現在のフィールドの数を比較し、フィールドの数が以下の場合(NF <= old_NF {print prev})に保存された行を印刷します。そして、常に最後の行を出力します(END {print $0})。


レベルは常に同じであるとは限らないため、パスがどれだけ深くても最下位レベルに到達するにはより柔軟である必要があります。

@ Colin747私の更新された答えをご覧ください...
Theodros Zelleke

しかし、それはそのような場合には適切に動作しません(または質問を誤解していますか?):./source ./source/siteA ./source/siteA/regionA ./a/very/long/path/to/some/where/ else ./aこれは4行目のみを出力します。

@SahandMozaffari前にfindプリントが、それは間違いなく./a、./a/veryを印刷し./a/very/long/path/to/some/where/elseそれが動作する理由、...それは;-)だ
Theodros Zelleke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.