ディレクトリツリー内のすべてのファイルを書き換えるコマンドラインツール

ディレクトリツリー内のすべてのファイルを書き換えるコマンドラインツール

ディレクトリツリーのすべての一般的なファイルを所定の位置に書き換えるか、新しいinodeを作成して書き換えるために使用できるコマンドラインツールはありますか?

そして所定の位置にファイルを書き換える、私の言葉は、読み取りと書き込みのためにファイルを開き、適切なサイズのチャンクを読み取り、そのチャンクを同じ場所に書き込むことです。ファイル全体に対してこれを行います。デフォルトでは、このコマンドラインが実行する操作は次のとおりです。

find dir -type f -print0 | xargs -0 -n1 bash -c 'dd if="$1" of="$1" conv=notrunc bs=64M' -

逆に、新しい inode が生成されると、次のコマンドが実行するように、可能であればファイル属性を置き換える必要があります。

find dir -type f -print0 | xargs -0 -n1 bash -c 'echo "$1"; cp -a "$1" "$1~" && mv "$1~" "$1"' -


背景:

適切な場合は、ZFS重複排除を使用するための経験を積んでベストプラクティスを見つけようとしています。 ZFS重複排除の使用法DDT(重複排除テーブル) ファイルで指定されたサイズのブロックで動作します。レコードサイズこれは重複排除効率とメモリ使用量に影響します。作成したデータを移行してDDTの使用を中止したり、ファイルレコードサイズを変更したりする可能性を探しています。 ZFSは記録されたデータに対してこれらのパラメータを自動的に変更しないため、データを再構築する必要があります。

DDTを使用するかどうかを変更するには、その場所でデータを再作成するだけです(新しいファイルを作成する必要はありません)。ただし、ファイルのレコードサイズは作成時に決定されるため、変更するには新しいファイルを作成する必要があります。

ベストアンサー1

私はこれを行うことができるツールを作成しました。

https://github.com/pjd/filerewrite

または、ZFSを使用してターゲットファイルシステムで重複排除が有効になっているzfs send / recvを使用することもできます。次に、ファイルシステムの名前を変更し、他のすべてのファイルシステムプロパティが移動されたことを確認する必要があります。

おすすめ記事