末尾にNULバイトがある約500個のファイルがあります。
truncate -s 8M <file>
どうすればゼロを切り取ることができますか?
このperlスクリプトはそれを行う必要があります:
for f in *; do
perl -e '$/=undef;$_=<>;s|\0+$||;print;' < $f > $f_fixed
done
これにより、すべてのNULがファイル内に保持され、最後にすべてが削除され、結果がに保存され<original filename>_fixed
ます。
スクリプトの説明: $/=undef
ファイルを行に分割するのではなく、ファイル全体を操作するようにperlに指示します。$_=<>
ファイルをロードします。s|\0+||
ロードされたファイル'string'の最後にあるNULの文字列を削除します。結果をprint
出力します。残りは標準のBashファイルリダイレクトです。
trを使用します:
cat $input_file | tr -d '\0' > $output_file
$input_file
と$output_file
は異なっている必要があることに注意してください
@Eeveeの提案に従って、実際にはこれらのファイルを8M未満で切り捨てることを回避できます。truncate
ループで次の条件を使用し、sizeパラメーターにサフィックスを追加しない場合はデフォルトとしてバイトを想定するという事実を使用すると、8M未満のファイルはパディングされません。
for file in $(ls -c1 directory); do
# ...
SIZE=$(stat -c%s $file)
LIMIT=$((8 * 1024 * 1024))
if [ "$SIZE" -lt "$LIMIT" ]; then
truncate -s $SIZE $file
else
truncate -s 8M $file
fi
# ...
done
この特定のケースでは、実際にはUnixツールはありません。Python(3)スクリプトは次のとおりです。
import sys
for fn in sys.argv[1:]:
with open(fn, 'rb') as f:
contents = f.read()
with open(fn, 'wb') as f:
f.write(contents.rstrip(b'\0'))
実行:
python retruncate.py file1 file2 files* etc...