1

末尾にNULバイトがある約500個のファイルがあります。

truncate -s 8M <file>

どうすればゼロを切り取ることができますか?

4

5 に答える 5

2

この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ファイルリダイレクトです。

于 2013-01-16T01:59:04.703 に答える
0

ファイルが「バイナリ」ファイルではなく「テキスト」ファイルである場合は、次のようにするだけです。

strings a.txt > b.txt

ref

于 2013-01-16T01:17:38.287 に答える
0

trを使用します:

cat $input_file | tr -d '\0' > $output_file

$input_file$output_fileは異なっている必要があることに注意してください

于 2013-01-16T01:32:30.573 に答える
0

@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
于 2013-01-16T01:40:37.750 に答える
0

この特定のケースでは、実際には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...
于 2013-01-16T01:55:54.943 に答える