2013-01-16 38 views
1

我有尾隨NUL字節,可能與截斷NUL字節off文件

truncate -s 8M <file> 

我怎樣才能切斷零生產了大約500個文件?

+1

你是指ASCII字符爲零('0')還是NUL字節?後者聽起來更像是從截斷(二進制)文件中得到的內容。 – Eevee

+0

它是NUL字節。 – Reactormonk

+1

文件是否有NUL個字節_ because_您使用了'truncate',它將較短的文件填充到所需的大小?也許真正的答案是不要在小於8M的文件上使用它:) – Eevee

回答

2

此perl腳本應該這樣做:

for f in *; do 
    perl -e '$/=undef;$_=<>;s|\0+$||;print;' < $f > $f_fixed 
done 

這將保留該文件中的所有完全無效,刪除任何最後,將結果保存到<original filename>_fixed

腳本說明:$/=undef告訴perl對整個文件進行操作,而不是將其分割成行; $_=<>加載文件; s|\0+||刪除加載文件'string'結尾處的任何NUL字符串;和print輸出結果。其餘的是標準的Bash文件重定向。

0

如果該文件是一個 「文本」 文件,而不是一個 「二進制」 文件,你可以簡單地做

strings a.txt > b.txt 

ref

0

使用tr

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

注意$input_file$output_file必須不同

+1

這也刪除不在文件末尾的NUL字節。 – Reactormonk

+0

啊,好點,我認爲(錯誤地)這些是文本文件。 –

0

遵循@Eevee的建議,實際上可以避免截斷8M以下的文件。使用在循環以下條件和事實truncate將承擔字節爲默認值,如果你不附加任何後綴的大小參數,這不會墊下面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 
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...