Làm cách nào để làm trống (“cắt bớt”) một tệp trên linux đã tồn tại và được bảo vệ bằng cách nào đó?


113

Tôi có một tệp có tên là error.log trên máy chủ của mình mà tôi cần thường xuyên cắt bớt. Tôi có quyền rw cho tệp. Mở tệp trong vi> xóa tất cả nội dung> lưu hoạt động (hiển nhiên). Nhưng khi tôi thử những thứ bên dưới

cat /dev/null > error.log

tôi nhận được tin nhắn

File already exists.

Rõ ràng là có một số loại cấu hình được thực hiện trên máy chủ để ngăn chặn việc ghi đè tệp một cách ngẫu nhiên. Ai có thể cho tôi biết làm thế nào để tôi "cắt ngắn" tệp trong một lệnh duy nhất?


2
Đối với tệp không được bảo vệ, tệp truncate -s 0 hoạt động.
Pramod

Câu trả lời:


158

Bạn có noclobbertùy chọn được thiết lập. Có vẻ như lỗi là do csh, vì vậy bạn sẽ làm như sau:

cat /dev/null >! file

Nếu tôi sai và bạn đang sử dụng bash, bạn nên làm:

cat /dev/null >| file

trong bash, bạn cũng có thể rút ngắn nó thành:

>| file

bạn nói đúng về shell là csh. Làm sao mà bạn biết được điều đó?
Sumeet Pareek

6
@Wikidkaka - dựa trên thông báo lỗi. csh trên hệ thống của tôi cho File existslỗi tương tự trong khi bash cho cannot overwrite existing filelỗi rất khác .
R Samuel Klatchko

6
@Jarmund - vì người dùng có bộ noclobber, >filekhông hoạt động.
R Samuel Klatchko

Sự khác biệt giữa > filevà là >| filegì?
Will

1
@Will - nếu bạn đã noclobberđặt tùy chọn, việc cố gắng chuyển hướng đến tệp hiện có không thành công. Để ghi đè cho chuyển hướng cụ thể trong khi rời khỏi noclobber trên, bạn có thể sử dụng>|
R Samuel Klatchko

71

Bạn cũng có thể sử dụng hàm cắt ngắn

$truncate -s0 yourfile

nếu quyền bị từ chối, hãy sử dụng sudo

$sudo truncate -s0 yourfile

Trợ giúp / Hướng dẫn: người đàn ông cắt ngắn

đã thử nghiệm trên ubuntu Linux


1
truncate cũng chạm vào thời gian sửa đổi của tệp - trong khi "> tệp" không chạm vào nếu tệp không thay đổi.
dsteinkopf

Nó không giải phóng dung lượng đĩa mà tệp đang giữ. Lúc đầu, nó hiển thị 0 byte. Nhưng khi bạn ghi một cái gì đó vào tệp đó, kích thước tệp là = trước khi cắt bớt + kích thước dữ liệu mới.
Aniket Kulkarni

48

Điều này sẽ đủ để đặt kích thước tệp thành 0:

> error.log

6
trên thực tế, điều này không hoạt động với noclobber (tôi đã tự kiểm tra), vì vậy nó KHÔNG PHẢI là giải pháp hợp lệ trong trường hợp này ("-bash: error.log: không thể ghi đè tệp hiện có"); xem phần khen ngợi ở trên ("@Jarmund - bởi vì người dùng có bộ noclobber,> tệp không hoạt động."). Tôi chỉ tự hỏi những gì loại "người thông minh" câu trả lời rõ ràng là sai phiếu bầu tán thành như thế này ...

9

tín dụng dành cho đồng nghiệp cấp cao của tôi cho điều này:

:> filename

Điều này sẽ không phá vỡ các tệp nhật ký, vì vậy bạn thậm chí có thể sử dụng nó trên nhật ký hệ thống, chẳng hạn.


8
Vui lòng giải thích. Làm thế nào nó hoạt động? Ký hiệu đó đang làm gì?
user31986

2
@ user31986 :là một lệnh không có hiệu lực (gần như là một chú thích), sau đó >được chuyển hướng như bình thường, do đó, điều này chỉ chuyển hướng việc thiếu đầu ra từ một lệnh không thực hiện gì vào tệp. Nếu noclobber được bật, bạn cần :>| filename(bash) (và tôi đoán :>! filenametrong csh giả sử csh có :).
Rhubbarb,

4

false | tee fileToTruncate

cũng có thể hoạt động


Điều đó thật ngớ ngẩn. Hoặc nếu điều này hữu ích, thì ddkhông có gì để xuất ra một cách rõ ràng thậm chí sẽ không tốt hơn so với thông thường có thể đọc được false?
tripleee

2

Vì sudo sẽ không hoạt động với chuyển hướng > , tôi thích teelệnh cho mục đích này

echo "" | sudo tee fileName

tốt, thực sự nó có, như được mô tả trong cả câu hỏi bạn đã liên kết và ở đây ở trên. "sudo sh -c '> error.log'" ...

nó phụ thuộc vào quyền trên tệp đích error.log, nếu tệp đó đã có thể ghi thì không cần phải sudo. Tôi nghĩ vấn đề khác là bạn đang đi qua lệnh như là đối số chuỗi sh, tôi không biết làm thế nào mà được xử lý trong nội bộ nhưng đó là một lớp phức tạp / chuyển hướng bổ sung
sakhunzai

1
Điều này sẽ không thực sự cắt bớt tệp, vì echo ""sẽ thêm một dòng mới. Bạn có thể sử dụng echo -n ""để ngăn dòng mới
Seb

0

Bất kỳ ai cũng có thể thử lệnh này để cắt bớt bất kỳ tệp nào trong hệ thống linux

Điều này chắc chắn sẽ hoạt động ở bất kỳ định dạng nào:

truncate -s 0 file.txt


-4

Bạn cũng có thể thử:

echo -n > /my/file


8
Xem câu trả lời với một tấn phiếu bầu? Hãy thử đọc nó, tra cứu noclobbervà sau đó tự hỏi bản thân xem câu trả lời của bạn có hợp lý không.
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.