ls ~ -R
コマンドを使用して、現在のディレクトリで最も長いパス(最も多くのサブディレクトリを含む)があるディレクトリを見つける方法
答え1
GNU は、述語の書式指定子を使用して、見つかったfind
名前の深さを出力できます。%d
-printf
find . -type d -printf '%d\t%p\n'
これは、現在のディレクトリまたはその下に見つかったディレクトリの深さと検索パスに対する.
ディレクトリパス名を出力します。深さとパス名は単一のタブに分けられます。
\0
この情報をソートなどのために他のツールに正しく渡すために、パス名に改行文字を含めることができるとします。フォーマット文字列の末尾の代わりに使用する方が\n
安全です。その後、GNUを使用して結果のNULL出口リストをソートし、sort
GNUとGNUを使用して最も深いパス名を選択できます。これらのツールのGNUバリアントは、すべて非標準オプションを渡すとnullで終わるレコードを処理でき、標準ツールはすべてテキスト行を処理できます。tail
cut
-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を含む)がある場合、このスクリプトは大幅に失敗します。