より高い(inodeあたりの最大ハードリンク数)ファイルシステムの大容量ファイルセットを_PC_LINK_MAX
より低いファイルシステムに変換しています。
特に、上記のように最大175までサポートするAmazon EFSを使用しています。ここ。
したがって、入力がファイルあたりの最大リンク数が100になるように、inodeが分割されるようにサイズ変更された最大250のリンクを持つファイルセットになりたいと思います。
hardlink
これを行う賢い呼び出しはありますか?それともオプションがあるか役に立ちrsync -aH
ますかcp -a
?
...そうでなければ、いくつかのハッキングが必要です...
答え1
状況が面倒です。最大リンクが5つ、
a01
すべてa12
ハードリンクされた12のファイルがあるとします。などがまだ互いにハードに接続されている場合は、a01..a05
合計を分割する必要がありますが。a06..a10
a11..a12
a06
a07
a01
これは、110個のハードリンクを持つrsync
私のシステムのサンプルソースディレクトリ()で実行されるbashスクリプトです。src=/usr/libexec/git-core/
この関数は、ターゲットディレクトリmax
で最大50個のlink()をシミュレートします。実際の状況では無視します。realdest
sim
リンクが多すぎます。エラーが発生したため、その機能は使用されません。
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