Tập lệnh Unix shell để cắt bớt một tệp lớn


87

Tôi đang cố gắng viết một tập lệnh Unix sẽ cắt bớt / làm trống một tệp đang được ứng dụng viết / mở liên tục khi nó đạt đến 3GB dung lượng. Tôi biết rằng lệnh dưới đây sẽ thực hiện điều đó:

cp /dev/null [filename]

Nhưng tôi sẽ chạy điều này trong môi trường sản xuất tự động như một công việc cron - chỉ cần đăng ở đây để xem các bạn có gặp phải bất kỳ vấn đề gì khi làm điều gì đó tương tự như thế này không.


Đây là sản phẩm. nhật ký không có giá trị? Tôi đã may mắn giữ nhật ký sản xuất của mình trong hơn một năm (trong bzip2 -9 fmt) và có một số tiện ích nhỏ giúp dễ dàng trích xuất thời gian chạy công việc, xử lý hồ sơ và khi tải vào bảng tính, dễ dàng tính toán và vẽ biểu đồ tỷ lệ tải và nhiều thứ. Chúng tôi đã phát hiện ra sự cố hdwr do tỷ lệ tải giảm. Có, có những công cụ giám sát đáng yêu trên mạng, vì vậy tất cả phụ thuộc vào tình huống của bạn. NHƯ MỘT LỰA CHỌN RIÊNG, bạn đã xem chưa logrotate, nó có thể cung cấp cho bạn một số giá trị (nhưng gây khó chịu khi thiết lập nó (chỉ là phỏng đoán)!).
shellter

5
Lưu ý rằng nếu tệp nhật ký được mở bằng cờ O_APPEND, thì việc cắt ngắn có hiệu lực. Nếu nó không được mở bằng cờ O_APPEND, thì chương trình sẽ tiếp tục ghi ở offset 3 GiB (lần đầu tiên); hệ thống sẽ coi 3 GiB đầu tiên là all-byte-zero (nén tốt), nhưng tệp sẽ tiếp tục phát triển. Tất cả phụ thuộc vào chương trình viết nhật ký.
Jonathan Leffler

Câu trả lời:


116

Chỉ để thêm một câu trả lời khác,

: > filename

: là cấm tham gia (tuân thủ POSIX), vì vậy về cơ bản điều này chỉ cần mở tệp để ghi (tất nhiên là cắt ngắn tệp) và sau đó ngay lập tức đóng nó.

CHỈNH SỬA: như shellter đã nhận xét, bạn thực sự không cần lệnh để đi cùng với chuyển hướng:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

Một chuyển hướng đơn giản tự nó sẽ xóa tệp.


24
hoặc chỉ > filename(như tôi chắc bạn biết). Chúc mọi người may mắn.
shellter

5
@shelter "$> tệp" không phải POSIX và không di động. Bạn nên sử dụng lệnh no-op ":" trước khi chuyển hướng, như đề xuất ban đầu.
Aaron Toponce

2
+ cộng thêm cho khuôn mặt cười
Chris Suszyński

2
Như @AaronToponce đã tìm ra, "$> tệp" thực sự không di động; trên thiết lập Zsh của tôi, nó làm cho shell bị treo (được cho là đang chờ đầu vào). "$:> file" hoạt động tốt trong Zsh.
Linus Arver

1
@TechEresisast Nó phụ thuộc vào kỳ vọng của bạn. Bản thân sự cắt ngắn là nguyên tử, nhưng bạn không thực sự biết khi nào nó sẽ xảy ra liên quan đến bất kỳ cách viết cụ thể nào. Ví dụ, bạn có thể kết thúc bằng một phần dòng ở đầu tệp.
chepner

65

Tôi đã sử dụng lệnh sau trên debian

truncate -s 0 filename

@SteveClay: sudo sh -c ': > filename'cũng sẽ bị cắt bớtfilename
Perleone

2
@SteveClay Các Ops gợi ý cũng làm việc một cách hoàn hảo với sudo: sudo cp /dev/null filename. Cũng cplà di động trong khi truncatechỉ Linux hiện đại.
Tino

11

Điều đó có vẻ hợp lý với tôi. Tất nhiên Unix sẽ cho phép bạn làm điều này với khoảng 50 cách khác nhau. Ví dụ,

echo -n "" >filename
cat /dev/null >filename

2

trunc filename

hoạt động trên hương vị AIX của UNIX

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.