私は-lsとfindコマンドを使ってディレクトリのハードリンクの発生回数を数えようとしました。
ls -liコマンドを使用して2より大きいすべてのリンク数を物理的に計算することに加えて、これを行う簡単な方法はありますか?
答え1
そしてzsh
:
(){echo $#} *(NDl+1)
.
カウントされませんのでご注意ください..
。
ディレクトリ(ほとんどのファイルシステムでは常にハードリンク)を計算したくない場合は、に変更します*(NDl+1^/)
。
(){echo $#}
引数の数を出力する匿名関数*(...)
glob修飾子を持つglobN
:nullglob
このglobを有効にします(一致するものがない場合は空になるように拡張されます)。D
:dotglob
このglobを有効にします(隠しファイルは含まれていますが.
含まれていません..
)。l+1
:リンク番号が1より大きいファイルを選択します。^/
: ファイル形式の除外目次。
POSIXに対応:
find .//. ! -name . -prune -links +1 | grep -c //
(除外ディレクトリ! -type d
に追加-prune
)
または以下を使用してls
:
(export LC_ALL=C; ls -Aqn | awk 'NR > 1 && $2 > 1 {n++}; END {print n}')
ディレクトリを除外するには、&& $1 !~ /^d/
後に追加してください$2 > 1
。
答え2
ls -qAi | awk '{print $1}' | sort | uniq -d | wc -l
冗長インデックスノード数の計算現在のディレクトリに(それぞれ1つずつ、すべての項目を計算するために-d
置き換えます-D
)、他のすべてのリンクが現在のディレクトリの外にあるハードリンクは計算されません。.
そして..
除外されました。交換はそれを-A
追加します-a
(ただし、現在のディレクトリにハードリンクがある可能性は低いですが)。
より短い方法があるかもしれませんが、これは非常に例示的です。
Mr. Pipeは|
あなたの友人です。
(man
また)
楽しくお過ごしください!
答え3
Linux環境では、stat
ファイルごとにコマンドを使用してリンク数を尋ねることができます。を使用して、ドットファイルをカウントに含めるかカウントから除外するかを決定できますshopt -s dotglob
。以下のループでは、わざとディレクトリをスキップしました。
shopt -s dotglob
i=0
for f in ./*
do
[ -d "$f" ] && continue
if [ $(stat -c %h "$f") -gt 1 ]
then
i=$((i+1))
fi
done
またはGNU検索を使用してください。
find . -maxdepth 1 \! -type d -links +1 -printf . | wc -c
これを行うには、find
現在のディレクトリ()で検索を開始する必要があります.
。
- ただ現在のディレクトリ(
-maxdepth 1
) - ディレクトリをスキップする(シェルからエスケープされ
! -type d
たディレクトリ)!
- リンク数が1より大きい場合
- この場合、印刷期間(
.
) - ...そして放出されたサイクル数を計算します。
答え4
次の1行のコードを使用して、ハードリンクの数が最も多いファイルを見つけます。
find . -type f -exec ls -l {} \; | sort -nrk 2 | head -n 1
同じ内容を探している他の人に役立つことを願っています。