Bagaimana cara memotong file ke ukuran tertentu di Linux?

19

Saya ingin mengecilkan ukuran file dengan kekerasan, yaitu, saya tidak peduli tentang sisanya, saya hanya ingin memotong file, katakan setengahnya, dan buang sisanya.

Hal pertama yang terlintas di benak saya adalah truncate Perl . Saya mengikuti contoh di halaman itu dan melakukan hal yang persis sama:

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

Tetapi file tersebut masih memiliki ukuran yang sama:

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

Bagaimana saya bisa membuat ini berfungsi?

xpt
sumber

Jawaban:

62

Anda mungkin ingin menggunakan perintah truncate :

truncate --size=1G test.txt

UKURAN dapat ditentukan sebagai byte, KB, K, MB, M, dll. Saya berasumsi Anda dapat menghitung ukuran yang diinginkan dengan tangan; jika tidak, Anda mungkin dapat menggunakan perintah stat untuk mendapatkan informasi tentang ukuran file saat ini.

ChrisInEdmonton
sumber
Its dokumentasi (dalam format Info) dari coreutils.
Cristian Ciupitu
21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

membuka file untuk dibaca. Namun, untuk memotong file Anda perlu memodifikasinya, sehingga pegangan file read-only tidak akan berfungsi. Anda perlu menggunakan mode "ubah" ( "+>").

Sebagai masalah sampingan, selalu mengherankan saya ketika orang membiarkan panggilan sistem gagal diam-diam dan kemudian bertanya apa yang salah. Bagian penting dari mendiagnosis masalah adalah melihat pesan kesalahan yang dihasilkan; bahkan jika Anda tidak memahaminya, itu membuat hidup lebih mudah bagi mereka yang Anda minta bantuan.

Berikut ini akan sedikit lebih membantu:

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

meskipun harus diakui bahwa hanya akan melaporkan "argumen tidak valid". Namun, itu adalah informasi yang berguna dan mungkin telah mengarahkan Anda pada kesimpulan bahwa mode buka salah (seperti yang terjadi pada saya).

Rici
sumber
3

Anda dapat menggunakan tailuntuk memotong 100000 byte terakhir, contoh:

tail -c 100000 file> file2

-c menampilkan final 100000 bytes file, untuk lebih banyak opsi:

buntut manusia

Untuk mengganti file asli dengan file yang baru saja Anda buat:

file mv file2

Ivan Malyshev
sumber
2

Jawaban di atas mengutip truncate bagus. dd juga akan melakukan pekerjaan:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt
James Georgas
sumber
1
Ungkapan kuncinya adalah "dengan ukuran tertentu" , katakan 1000. Saya akan mengubah jawaban ke yang paling banyak dipilih, yang bekerja untuk input on-the-fly - tidak perlu file perantara.
xpt
0

ada cara yang sangat berbeda untuk melakukan ini, dengan bash, menggunakan program ed. skrip berikut akan mempertahankan hanya 5000 baris terakhir dari semua file yang duduk di direktori yang ditentukan. ini dapat dengan mudah dimodifikasi untuk mengulang beberapa direktori, mengubah jumlah baris, dll.

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
richard
sumber