ハードリンク数を減らす便利なスクリプト?

ハードリンク数を減らす便利なスクリプト?

より高い(inodeあたりの最大ハードリンク数)ファイルシステムの大容量ファイルセットを_PC_LINK_MAXより低いファイルシステムに変換しています。

特に、上記のように最大175までサポートするAmazon EFSを使用しています。ここ

したがって、入力がファイルあたりの最大リンク数が100になるように、inodeが分割されるようにサイズ変更された最大250のリンクを持つファイルセットになりたいと思います。

hardlink これを行う賢い呼び出しはありますか?それともオプションがあるか役に立ちrsync -aHますかcp -a

...そうでなければ、いくつかのハッキングが必要です...

答え1

状況が面倒です。最大リンクが5つ、 a01すべてa12ハードリンクされた12のファイルがあるとします。などがまだ互いにハードに接続されている場合は、a01..a05合計を分割する必要がありますが。a06..a10a11..a12a06a07a01

これは、110個のハードリンクを持つrsync私のシステムのサンプルソースディレクトリ()で実行されるbashスクリプトです。src=/usr/libexec/git-core/この関数は、ターゲットディレクトリmaxで最大50個のlink()をシミュレートします。実際の状況では無視します。realdestsimリンクが多すぎます。エラーが発生したため、その機能は使用されません。

rsync -ni最初の一般的なrsync(エラーを含む)の後、ファイル名をfunctionとして抽出して、欠落しているcalctodoファイルのリストを作成します/tmp/todo

rsync次に、欠落しているファイルを再び無視するループがあります。リンクが多すぎます。2*175エラー(元のディレクトリに複数のリンクがある場合はエラーが発生します)。正常に作成されたファイルはハードリンクされます。見つからないファイルの新しいリストを計算します。ファイルがなくなるまでこれを繰り返します。

src=/usr/libexec/git-core/
realdest=/tmp/realdest
#rm -fr "$realdest"
max=50
sim(){
    find ${1?} -links +$max |
    sed "1,${max}d" |
    xargs --no-run-if-empty rm
}
calctodo(){
    sed -n '/^hf/{ s/[^ ]* //; s/ =>.*//; p }' >/tmp/todo
}

rsync -aHR   "$src" "$realdest"; sim "$realdest"
rsync -niaHR "$src" "$realdest" | calctodo

while  [ -s /tmp/todo ]
do  mv /tmp/todo /tmp/todo.old
    rsync -aHR  --files-from=/tmp/todo.old / "$realdest"; sim "$realdest"
    rsync -niaHR --files-from=/tmp/todo.old / "$realdest" | calctodo
done

ファイル名に「=>」、改行文字などが含まれている場合は、この設定を変更する必要があります。


ファイルシステムでサポートされているリンクの最大数は、以下で確認できます。

getconf LINK_MAX /some/directory

関連情報