シンボリックリンクでいっぱいのフォルダ内で、最も長いフォルダ名を含むシンボリックリンクを見つける必要があります。これまで私はこれを持っています:
find <folder> -type l -printf "%l\n"
次の疑似コードのように、検索中にフォルダ名を保存する方法があるかどうか疑問に思います。
if [length > max]
{
max = length
var = link
}
ありがとうございます:)
答え1
find /path/to/base -type l | awk -F/ 'BEGIN {maxlength = 0; longest = "" } length( $NF ) > maxlength { maxlength = length( $NF ); longest = $NF } END { print "longest was", longest, "at", maxlength, "characters." }'
コンテンツをawk
読みやすくするには:
BEGIN {
maxlength = 0
longest = ""
}
length( $NF ) > maxlength {
maxlength = length( $NF )
longest = $NF
}
END {
print "longest was", longest, "at", maxlength, "characters."
}
awk
区切られたデータを処理するのに非常に熟練しています。パスはsで区切られているため、/
フィールド区切り記号(スイッチを使用)として使用して、変数に表示される最も長い名前と変数の長さを-F
追跡します。リンクが見つからない場合は、読者が正しい出力を維持できるように、いくつかの注意とフィードバックを練習のままにしておきます。longest
maxlength
答え2
そしてzsh
:
zmodload zsh/stat
by_link_depth() {
zstat -A REPLY +link -- ${1-$REPLY}
REPLY=${REPLY//[^\/]}
}
グローバル変数のソート方法として使用できるシンボリックリンクターゲットからスラッシュを返す関数を定義します。
ls -ld -- **/*(D@O+by_link_depth[1])
最も深いターゲットを持つ隠しシンボリックリンク()を含むシンボリックリンク(@
)が一覧表示されます(リンクの深さによって逆順に並べ替えられ、最初の項目が選択されます)。D
O+by_link_depth
[1]
ここで/usr/bin
:
$ ls -ld -- **/*(D@O+by_link_depth[1])
lrwxrwxrwx 1 root root 59 Oct 9 03:08 mptopdf -> ../share/texlive/texmf-dist/scripts/context/perl/mptopdf.pl
$ ls -lUd -- **/*(D@O+by_link_depth[1,3])
lrwxrwxrwx 1 root root 59 Oct 9 03:08 mptopdf -> ../share/texlive/texmf-dist/scripts/context/perl/mptopdf.pl*
lrwxrwxrwx 1 root root 61 Oct 9 03:09 pkfix-helper -> ../share/texlive/texmf-dist/scripts/pkfix-helper/pkfix-helper*
lrwxrwxrwx 1 root root 60 Oct 9 03:09 mkjobtexmf -> ../share/texlive/texmf-dist/scripts/mkjobtexmf/mkjobtexmf.pl*
zstat +link
最大ディープリンクターゲットにのみ興味があり、それを指すシンボリックリンクに興味がない場合は、代わりにそのシンボリックリンクで実行するか、関数をls -ld
定義できます。resolve
by_depth
resolve() zstat -A REPLY +link -- ${1-$REPLY}
by_depth() REPLY=${REPLY//[^\/]}
そして:
printf '%s\n' **/*(D@O+by_depth+resolve[1])
+resolve
シンボリックリンクをグローバル拡張ターゲットに変換し、O+by_depth
深さで逆順に並べ替えます。
bash
(以下のコードは決して具体的bash
ではありませんが)とGNUユーティリティ(あなたのユーティリティはすでにGNUに特化しています)を使用すると、-printf
同様の結果が得られます。
find . -type l -printf '%l\0%p\0' | gawk -v RS='\0' -v ORS='\0' -F / '
{n = NF; getline; if (n > max) {max = n; file = $0}}
END {if (max) print file}' | xargs -r0 ls -ld
または最も深いターゲットの場合:
find . -type l -printf '%l\0' | gawk -v RS='\0' -F / '
NF > max {max = NF; target = $0}
END {if (max) print target}'