Làm thế nào để xóa nội dung của một tập tin từ dòng lệnh?


280

Tôi có một tệp nhật ký có rất nhiều thứ trong đó mà tôi không cần nữa. Tôi muốn xóa nội dung.

Tôi biết cách in nội dung ra màn hình:

cat file.log

Tôi biết cách chỉnh sửa tệp, từng dòng một:

nano file.log

Nhưng tôi không muốn xóa từng dòng một. Có cách nào để làm điều đó trong một lệnh mà không phá hủy tệp để làm điều đó không?

Câu trả lời:


465

Trong bash, chỉ

> filename

sẽ làm.

Điều này sẽ để lại cho bạn một tên tập tin trống .

ps

Nếu bạn cần sudogọi, xin vui lòng xem xét để sử dụng truncatenhư được trả lời ở đây .


57
Đây có lẽ là lệnh mạnh nhất trong lịch sử điện toán
blarg

7
Ngược lại, @ Arekkusandaa.Irujasukin; Nó chỉ hoạt động tốt trong mọi phiên bản Windows, miễn là, như đã đề cập, bạn đang sử dụng bashlàm vỏ của mình chứ không phải cmd.exePowerShell, cả hai đều không đủ POSIXy để xử lý những việc đó.
DopeGhoti

124

Bạn có thể sử dụng lệnh người dùng: cắt ngắn

truncate -s 0 test.txt

("-s 0" để chỉ định kích thước)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
Câu trả lời hay nhất xung quanh, hoạt động khi bạn không root (với sudo) - sudo echo > filechỉ đưa ra lỗi trong các trường hợp như vậy.
Dmitry Verkhoturov

12
@DmitryVerkhoturov: sudo bash -c '> filename'là cách bạn sử dụng các giải pháp Bash với sudo.
Stuart P. Bentley

1
brew install truncatetrên os x với homebrew được cài đặt.
xaxxon

Hoạt động nhanh hơn tiếng vang
Miao1007

34

Bạn có thể làm điều này:

echo -n "" > file.log

Sử dụng >để ghi đầu vào (null) từ echo -ntệp.

Việc sử dụng >>sẽ nối thêm đầu vào null vào tệp (thực tế không làm gì ngoài touchviệc lấy nó).


Điều này sẽ để lại một không gian trong đó.
dmckee

Tôi đang nhận được điều này: -bash :: không tìm thấy lệnh
Andrew

3
echo ""> vẫn sẽ cung cấp cho bạn một tệp có một ký tự (một dòng mới.) Nếu bạn muốn sử dụng echo, hãy sử dụng "echo -n> file.log" để echo null.
Dave Forgac

Sẽ tốt hơn nếu sử dụng một lệnh null-output chuyên dụng như true(hoặc bí danh dựng sẵn của nó :), mặc dù cuối cùng bạn không cần một lệnh nào cả (xem câu trả lời được chấp nhận).
Stuart P. Bentley

Bạn có thể có một số vấn đề với sudo.
flapjack

27
: > file.log

Tương tự như > filenametrong Bash, nhưng hoạt động trong nhiều shell hơn (tín dụng) . Chuyển hướng đầu ra từ tích hợp true(không có đầu ra) đến filename.


Tôi đã đến để đưa ra câu trả lời này, nhưng than ôi nó đã ở đây ... Hãy tham gia.
Aaron Hall

5
Cứ làm đi :> filename. Nó không giống như một nụ cười? :>
minmaxavg

10

ZSH

>! filename

ZSH sẽ bảo vệ người dùng khỏi các tập tin bị chặn bằng cách sử dụng toán tử chuyển hướng io >. Nếu bạn sử dụng, >!bạn có thể buộc cắt bớt một tập tin hiện có.

Nếu bạn muốn ZSH sử dụng hành vi chuyển hướng của Bash, không có sự bảo vệ nào khỏi việc ghi đè tệp, thì bạn cần đặt clobbertùy chọn cho trình bao của mình.

Thông tin thêm: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

NẾU bạn muốn làm từ bên trong trình soạn thảo vim trong dòng lệnh, bạn có thể thử điều này:

vim file.txt 

Nhấn Esc.

:1,$d

Nhấn Enter.

Bạn sẽ tìm thấy tất cả các dòng bị xóa.


Đây là điều duy nhất làm việc cho tôi maillog, thậm chí sudo > /var/log/maillogsẽ không xóa nó (quyền bị từ chối)
bobobobo

2
@bobobobo Nó không hoạt động như sudo > /var/log/maillogphương tiện - chạy sudo và đưa đầu ra của nó vào tệp. Rõ ràng nó đặt đầu ra với quyền người dùng hiện tại. Điều dễ dàng hơn sudo suđể bắt đầu root shell và sau đó làm > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

hoặc là

$ cat > file.log

theo sau control-d.

hoặc ... hoặc ... hoặc ...

Ah. Đây là một phiên bản lệnh duy nhất:

$ dd if=/dev/null of=file.log

2
Đề xuất của Thechickenmoo echo "" > file.loglà tốt hơn so với cattùy chọn bạn hiển thị, trong tình huống này, có những nơi catkhác phù hợp hơn. cả hai sử dụng cùng một chuyển hướng vỏ để làm việc nặng.
quack quixote

2
Bạn không cần phải chạy lệnh mèo. Chỉ cần "> file.log" sẽ làm điều đó.
camh

Xóa tệp sẽ đặt lại ngày tạo.
Matteo

Xóa tệp sẽ khiến các chương trình xem tệp đó bị mất con trỏ của chúng (nghĩa là nó sẽ có một địa chỉ mới trong hệ thống tệp). Nói chung, có rmsẽ hoàn thành nhiệm vụ sản xuất một tệp trống có cùng tên. Nhưng nó sẽ không đúng cho mọi trường hợp sử dụng.
robert



1

Một vài lựa chọn thay thế:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

Nếu bạn có khoảng trắng trong tên tệp, hãy sử dụng:

for file in /path/to/file/*; do > "$file"; done

(Tôi không thể đưa nó vào nhận xét cho câu trả lời trước vì tôi không có 50 danh tiếng. Đôi khi, những hạn chế là chống lại năng suất.)


0

Một dòng tại một thời điểm?

Hãy thử vi (m), trình soạn thảo văn bản đáng yêu có thể làm bất cứ điều gì. Trong trường hợp này, điều hướng đến một dòng, nhấn d (để xóa) và d lần nữa (cho dòng).


5
Nếu bạn muốn loại bỏ toàn bộ tệp trong vim, với con trỏ ở đầu tài liệu, nhập d G (đó là d, sau đó shift-G) sẽ xóa toàn bộ tệp (d để xóa, G cho cuối tập tin). Mặc dù vậy, tôi thích phương pháp của bạn hơn (nó cho tôi thêm thời gian để suy nghĩ về việc tôi có thực sự muốn xóa tập tin hay không).
Babu

@Babu ggdi chuyển lên đầu để toàn bộ chuỗi có thể ggdG.
Bob

0

Với sự cho phép của tôi, đây là điều duy nhất hoạt động:

touch temp.txt
sudo mv temp.txt original-file.txt

0

Ngoài ra, nếu bạn có nhiều tệp, bạn có thể sử dụng như sau:

for file in /path/to/file/*; do > $file; done

Điều này rất hữu ích cho các tệp nhật ký trong cùng thư mục.


0

> a.txt

Giống như> tên tệp trong Bash, nhưng hoạt động trong nhiều shell hơn (tín dụng). Chuyển hướng đầu ra từ nội dung thực (không có đầu ra) thành tên tệp.

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.