Có một công cụ được tạo ra cho mục đích đó:
truncate -s 0 filename
Điều này sẽ xóa nội dung nhưng nó vẫn sẽ là cùng một tệp ( inode vẫn giữ nguyên).
Điều này rất quan trọng vì một số chương trình xử lý tệp "bằng inode". Giả sử bạn "làm trống" một tệp bằng phương pháp ngây thơ là xóa và tạo lại tệp. Một số chương trình vẫn có thể xử lý tệp cũ (với nội dung cũ) ngay cả khi nó không còn hiển thị trên mỗi phương tiện thông thường như ls
.
Một số liên kết đến chi tiết hơn ở cuối câu trả lời này.
Một cách khác, có thể dễ nhớ hơn:
echo -n > filename
Điều này cũng giữ cho inode tương tự.
Lưu ý rằng cả hai truncate
và echo -n
không được xác định bởi POSIX .
Để sử dụng tuân thủ POSIX cat /dev/null
:
cat /dev/null > filename
Một cách khác, tối nghĩa hơn và có lẽ không phải là bất khả tri:
> filename
Nếu tệp để cắt bớt cần đặc quyền gốc để ghi thì các dòng sau sẽ không hoạt động như mong đợi:
sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename
Điều này là do việc chuyển hướng được thực hiện bởi shell ngay cả trước khi sudo được thực thi. Điều đó có nghĩa là quyền truy cập ghi vào tệp được thực hiện bằng cách sử dụng các đặc quyền của người dùng chạy shell chứ không phải các đặc quyền sẽ được cấp bởi sudo.
Một cách giải quyết là trì hoãn chuyển hướng đến trình bao được thực thi bằng các đặc quyền sudo như thế này:
sudo sh -c "echo -n > filename"
Sử dụng truncate
bạn không cần một cách giải quyết như vậy bởi vì việc truy cập ghi không được thực hiện bởi trình bao mà do truncate
nó được thực thi bởi sudo bằng các đặc quyền sudo.
sudo truncate -s 0 filename
Để biết một số thông tin chi tiết về các chương trình giữ tệp mở ngay cả khi tệp đã bị xóa, bạn có thể đọc phần sau:
tail -n +1000 file.txt > file.txt
nên xóa 1000 dòng và giữ các dòng mới nhất trong tệp (bạn không bao giờ biết khi nào bạn có thể cần một số bản ghi gần đây để theo dõi một cái gì đó).