Làm trống nội dung của một tập tin


220

Tôi biết ba phương pháp để xóa tất cả các mục từ một tệp.

họ đang

  • >filename
  • touch filename
  • filename < /dev/null

Trong ba điều này tôi lạm dụng >filenamenhiều nhất vì điều đó đòi hỏi số lần nhấn phím ít nhất.

Tuy nhiên, tôi muốn biết cách nào hiệu quả nhất trong ba phương thức (nếu có bất kỳ phương pháp nào hiệu quả hơn) đối với các tệp nhật ký lớn và các tệp nhỏ.

Ngoài ra, làm thế nào để ba mã hoạt động và xóa nội dung?


24
Thế còn truncate -s 0 filename?
Martin Thoma

Rất giống với Sự khác biệt giữa con mèo và '>' để loại bỏ một tệp nơi bạn sẽ tìm thấy thêm thông tin.
Stéphane Chazelas

Cái đầu tiên sẽ chỉ hoạt động nếu được gọi từ dòng lệnh bash, nhưng sẽ không hoạt động nếu được thực thi trong tệp .sh
Marco Marsala

8
cảm ứng không xóa nội dung, nhưng thay đổi thời gian truy cập trên tập tin. Nó không tạo ra một tập tin trống nếu không tồn tại.
hbogert

Câu trả lời:


293

Trên thực tế, biểu mẫu thứ hai touch filenamekhông xóa bất cứ thứ gì khỏi tệp - nó chỉ tạo một tệp trống nếu không tồn tại hoặc cập nhật ngày sửa đổi cuối cùng của tệp hiện có.

Và thứ ba filename < /dev/nullcố gắng chạy tên tệp với /dev/nulltư cách là đầu vào.

cp /dev/null filename làm.

Đối với hiệu quả, hiệu quả nhất sẽ là truncate -s 0 filename; xem tại đây: http://linux.die.net/man/1/truncate .

Nếu không, cp /dev/null filenamehoặc > filenamecả hai đều tốt. Cả hai đều mở và sau đó đóng tệp, sử dụng cài đặt cắt ngắn khi mở. cpcũng mở ra /dev/null, do đó làm cho nó chậm hơn một chút.

Mặt khác, truncatecó thể sẽ chậm hơn so với > filenamekhi chạy từ một tập lệnh kể từ khi chạy lệnh cắt ngắn yêu cầu hệ thống mở tệp thực thi, tải nó và chạy nó.


9
Vậy tại sao bạn nói đó truncatelà hiệu quả nhất?
Stéphane Chazelas

7
Hoạt động cắt ngắn sử dụng lệnh gọi hệ thống ftruncate () hoặc truncate () mà không bận tâm để mở tệp. Nó cũng tránh cuộc gọi hệ thống close () mà cp và > filenamephương thức cần gọi.
tro

3
Trên thực tế, nó (ít nhất là GNU) thực hiện mở + ftruncate + close (ngoài nhiều hệ thống gọi nó để tải và tự khởi chạy), vì dù sao, nó sẽ phải tạo tệp nếu nó không tồn tại và truncate(2)không làm điều đó.
Stéphane Chazelas

Nếu chúng ta sử dụng touch filename, liệu inode có giữ nguyên (với điều kiện là đã có tệp trước đó) không?
pman

1
@pMan có, bạn có thể dùng thử và kiểm tra vớils -i
terdon

43

Tùy chọn khác có thể là:

echo -n > filename

Từ trang người đàn ông của echo:

-n Do not print the trailing newline character.


Làm thế nào tôi có thể thiết lập kích thước? Nói nếu tôi muốn 30000 ký tự null?
Người dùng

3

Có một lệnh dựng sẵn ":", có sẵn trong sh, csh, bash và những thứ khác có thể, có thể dễ dàng sử dụng với toán tử đầu ra chuyển hướng >cắt một tệp:

#!/usr/bin/env bash
:> filename

Điều tôi thích ở đây là, nó không cần bất kỳ lệnh bên ngoài nào như "echo", v.v.

Một lợi thế lớn của việc cắt bớt các tệp thay vì phân định / tạo lại chúng là, các ứng dụng đang chạy với tệp này (ví dụ: ai đó tạo tail -f filenamehoặc một phần mềm giám sát, ...) không phải mở lại. Họ chỉ có thể tiếp tục sử dụng filedescriptor và nhận được tất cả dữ liệu mới.


man bashmô tả :shell dựng là không có hiệu lực.
Haxiel

Có, và bạn chuyển hướng này với >tệp vào, tệp này tạo tệp nếu nó không tồn tại và nếu nó tồn tại, bạn cắt nó thành không. Nói tốt hơn: bạn sử dụng :để không làm gì và sử dụng >để chuyển hướng không có gì đến một tệp và cắt bớt nó.
Mirko Steiner

1
Tại sao bạn lại làm vậy? > filelà đủ để cắt một tập tin. Bạn không cần bất kỳ lệnh nào, chỉ cần toán tử chuyển hướng.
terdon

1
đôi khi, > filenamesẽ không làm việc. ví dụ: trong zsh. nhưng : > filenamevẫn hoạt động.
CS Pei

Bash và sh có vẻ thích > myfilenhưng ví dụ như lỗi csh với: Lệnh null không hợp lệ.
Mirko Steiner
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.