Có một số phương pháp để cắt ngắn hoàn toàn một tệp, thường áp dụng cho hầu hết các HĐH tuân thủ POSIX. Hầu hết các phổ biến mà bạn sẽ thấy với kịch bản shell là một cái gì đó giống như true > file.txt
hoặc : > file.txt
(và trong trường hợp của bash
vỏ, >
chuyển hướng một mình là đủ). Đó là do cách >
mở tệp qua open()
hoặcopenat()
bằng O_WRONLY|O_CREAT|O_TRUNC
cờ - đọc chỉ ghi HOẶC tạo nếu tên tệp không tồn tại, HOẶC cắt bớt tên tệp hiện có.
Với ý nghĩ đó, chúng ta có thể thực hiện một cái gì đó tương tự như vậy trong C:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc == 2){
int fd = open(argv[1],O_TRUNC);
close(fd);
}
return 0;
}
Đặt tên cho tệp lưu trữ mã này trunc.c
và biên dịch mã đó gcc trunc.c -o trunc
và bạn có cho mình một tiện ích nhỏ sẽ cắt bớt một đối số tên tệp mà nó cung cấp như trong trunc ./foobar.txt
. Tất nhiên, mã này không thực hiện các kiểm tra khác, nó chỉ cắt bớt tham số vị trí đầu tiên. Tôi sẽ để nó cho độc giả tìm ra cách xử lý nhiều hơn một tham số vị trí. Bên cạnh đó, có một truncate()
tòa nhà cao tầng mà chúng ta cũng có thể sử dụng và cắt một tập tin theo chiều dài thay đổi.
Bây giờ, nếu bạn không phải là fan hâm mộ của C, Python có thể dễ dàng hơn cho bạn. open()
lệnh hoạt động theo cùng một nguyên tắc trong Python - mở tệp để ghi và cắt bớt nếu tên tệp tồn tại. Như vậy chúng ta có thể làm
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
Đối với việc tìm tất cả .log
các tệp, điều đó đã được đề cập trong các câu trả lời khác - sử dụng toàn *
cầu hoặc mở rộng toàn cầu trong bash
. Ngoài ra, còn find -type f -name "*.log"
có -exec
cờ để chạy các lệnh (trong trường hợp cụ thể này sh -c ''
để tận dụng >
vì >
là toán tử shell chứ không phải là tệp thực thi bên ngoài). Do đó bạn có thể làm
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
Nó cũng đáng chú ý là file log trong thư mục như /var/log
thường được luân chuyển bằng dịch vụ logrotate, vì vậy sẽ có tên tập tin như /var/log/service.log
, /var/log/service.log.1
, vv, vì vậy bạn có thể muốn sử dụng *.log.[1-9]
mô hình thay vì
Trong số những thứ khác, chúng ta có thể sao chép /dev/null
vào tập tin mong muốn. Thật kỳ lạ, mặc dù /dev/null
là một loại tệp thiết bị ký tự đặc biệt, khi bạn sao chép ở nơi khác thì kết quả là tệp thông thường trống, ít nhất là với GNU cp
. Như vậy chúng ta có thể làm
cp /dev/null foo.txt
hoặc là
dd if=/dev/null of=foo.txt
Đề nghị đọc khác:
/var/log
là nơi hệ thống đặt các tin nhắn bạn có thể cần sau này. Ubuntu đã gặp phải vấn đề trước đây. Đọcman 8 logrotate;man logrotate.conf
.