Làm cách nào để cắt một tệp theo kích thước nhất định trong Linux?


19

Tôi muốn thu nhỏ kích thước tệp bằng cách mạnh mẽ, nghĩa là tôi không quan tâm đến phần còn lại, tôi chỉ muốn cắt tệp, nói một nửa và loại bỏ phần còn lại.

Điều đầu tiên xuất hiện trong đầu là cắt ngắn của Perl . Tôi đang theo dõi ví dụ trên trang đó và đã làm chính xác điều tương tự:

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

Nhưng tập tin vẫn có cùng kích thước:

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

Làm thế nào tôi có thể làm cho công việc này?

Câu trả lời:


62

Bạn có thể muốn sử dụng lệnh cắt ngắn :

truncate --size=1G test.txt

SIZE có thể được chỉ định là byte, KB, K, MB, M, v.v ... Tôi giả sử bạn có thể tính toán kích thước mong muốn bằng tay; nếu không, có lẽ bạn có thể sử dụng lệnh stat để lấy thông tin về kích thước hiện tại của tệp.


Tài liệu của nó (ở định dạng thông tin) từ coreutils.
Cristian Ciupitu

21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

mở tập tin để đọc. Tuy nhiên, để cắt bớt tệp bạn cần sửa đổi nó, vì vậy một trình xử lý tệp chỉ đọc sẽ không hoạt động. Bạn cần sử dụng chế độ "sửa đổi" ( "+>").

Là một vấn đề phụ, nó luôn làm tôi ngạc nhiên khi mọi người để các cuộc gọi hệ thống thất bại trong âm thầm và sau đó hỏi điều gì đã xảy ra. Một phần thiết yếu để chẩn đoán vấn đề là xem thông báo lỗi được tạo ra; ngay cả khi bạn không hiểu nó, nó sẽ giúp cuộc sống của những người bạn yêu cầu giúp đỡ dễ dàng hơn nhiều.

Sau đây sẽ có phần hữu ích hơn:

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

mặc dù phải thừa nhận rằng sẽ chỉ báo cáo "đối số không hợp lệ". Tuy nhiên, đó là thông tin hữu ích và có thể đã đưa bạn đến kết luận rằng chế độ mở là sai (như đã làm với tôi).


3

Bạn có thể sử dụng tailđể cắt 100000 byte cuối cùng, ví dụ:

đuôi -c 100000 tệp> tệp2

-c xuất ra 100000 byte cuối cùng của tệp, để có thêm tùy chọn:

người đàn ông đuôi

Để thay thế tệp gốc bằng tệp bạn vừa tạo:

tập tin mv2


2

Câu trả lời trên trích dẫn truncate là tốt đẹp. dd cũng sẽ thực hiện công việc:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
Cụm từ chính là "đến một kích thước nhất định" , giả sử 1000. Thay vào đó, tôi sẽ thay đổi câu trả lời thành câu được bình chọn nhiều nhất, hoạt động thành đầu vào nhanh chóng - không cần tệp trung gian.
xpt

0

có một cách hoàn toàn khác để làm điều này, với bash, sử dụng chương trình ed. đoạn script sau sẽ chỉ giữ lại 5000 dòng cuối cùng của tất cả các tệp nằm trong thư mục được chỉ định. điều này có thể dễ dàng được sửa đổi để lặp qua một số thư mục, thay đổi số lượng dòng, v.v.

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.