パスが最も長いディレクトリを見つける方法は?

パスが最も長いディレクトリを見つける方法は?

ls ~ -Rコマンドを使用して、現在のディレクトリで最も長いパス(最も多くのサブディレクトリを含む)があるディレクトリを見つける方法

答え1

GNU は、述語の書式指定子を使用して、見つかったfind名前の深さを出力できます。%d-printf

find . -type d -printf '%d\t%p\n'

これは、現在のディレクトリまたはその下に見つかったディレクトリの深さと検索パスに対する.ディレクトリパス名を出力します。深さとパス名は単一のタブに分けられます。

\0この情報をソートなどのために他のツールに正しく渡すために、パス名に改行文字を含めることができるとします。フォーマット文字列の末尾の代わりに使用する方が\n安全です。その後、GNUを使用して結果のNULL出口リストをソートし、sortGNUとGNUを使用して最も深いパス名を選択できます。これらのツールのGNUバリアントは、すべて非標準オプションを渡すとnullで終わるレコードを処理でき、標準ツールはすべてテキスト行を処理できます。tailcut-z

find . -type d -printf '%d\t%p\0' | sort -z -n | tail -z -n 1 | cut -z -f 2-

Final はcut文字列の先頭から数字の深さを削除します。

これにより、現在のディレクトリの下で最も長​​い(最も深い)ディレクトリパス名を含む標準出力にNULL終了文字列が提供されます。同じ深さの複数のパス名がある場合は、最後のパスに基づいてアルファベット順に並べられたパス名が提供されます。

答え2

以下では、ディレクトリ名に改行文字が含まれていないと仮定します。この場合、以下が機能します。

find . -type d | awk -F'/' 'NF>max{longest=$0;max=NF} END{if (max) print longest}'

find現在のディレクトリのすべてのサブディレクトリを検索します。最大フィールド数(=パスコンポーネント)を持つ入力文字列を識別するために、フィールド区切り文字をに設定してawk出力をに提供します。/入力文字列(存在する場合)が最後に印刷されます。

答え3

もちろん、解析された出力は一般的に望ましくありませんが、次の方法lsでこれを実行したい場合ls -R

ls -R ~ | grep '/' | while read var ; do
        res="${var//[^/]}"
        echo "${#res} $var"
done | sort -n | sed 's/^[^ ]* //' | tail -1

動作する必要があります。

注:これは決して完璧な方法ではありません。複雑なディレクトリ名(/名前に改行やaを含む)がある場合、このスクリプトは大幅に失敗します。

関連情報