最も長いファイル名を探す

最も長いファイル名を探す

シンボリックリンクでいっぱいのフォルダ内で、最も長いフォルダ名を含むシンボリックリンクを見つける必要があります。これまで私はこれを持っています:

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追跡します。リンクが見つからない場合は、読者が正しい出力を維持できるように、いくつかの注意とフィードバックを練習のままにしておきます。longestmaxlength

答え2

そしてzsh

zmodload zsh/stat
by_link_depth() {
  zstat -A REPLY +link -- ${1-$REPLY}
  REPLY=${REPLY//[^\/]}
}

グローバル変数のソート方法として使用できるシンボリックリンクターゲットからスラッシュを返す関数を定義します。

ls -ld -- **/*(D@O+by_link_depth[1])

最も深いターゲットを持つ隠しシンボリックリンク()を含むシンボリックリンク(@)が一覧表示されます(リンクの深さによって逆順に並べ替えられ、最初の項目が選択されます)。DO+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定義できます。resolveby_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}'

関連情報