2017-03-07 15 views
6

Tôi có một kịch bản lệnh shell và tôi muốn thêm một hoặc hai dòng nơi nó sẽ xóa tệp nhật ký chỉ khi nó tồn tại. Hiện tại, tập lệnh của tôi chỉ đơn giản là:Làm cách nào để xóa một tệp nếu nó tồn tại?

rm filename.log 

Tuy nhiên, nếu tên tệp không tồn tại, tôi nhận được thông báo nói filename.log không tồn tại, không thể xóa. Điều này có ý nghĩa nhưng tôi không muốn tiếp tục thấy rằng mỗi khi tôi chạy kịch bản. Có cách nào thông minh hơn với câu lệnh IF tôi có thể thực hiện việc này không?

+1

Vâng, hoàn toàn không thể xóa tệp không tồn tại, do đó, có vẻ như khái niệm "xóa tệp chỉ khi tệp tồn tại" là thừa. Vì vậy, 'rm -f filename', hoặc' rm filename 2 >>/dev/null', hoặc '[[-r filename]] && rm filename' sẽ là một số tùy chọn .. – twalberg

Trả lời

18

Vượt qua đối số -f để rm, mà sẽ gây ra nó để điều trị tình trạng này mà tập tin được đặt tên không tồn tại như thành công, và sẽ ngăn chặn bất kỳ thông báo lỗi trong trường hợp đó:

rm -f -- filename.log 

gì bạn nghĩa đen được yêu cầu sẽ giống như sau:

[ -e filename.log ] && rm -- filename.log 

nhưng bạn nên nhập và thêm các chế độ lỗi bổ sung. (Nếu một cái gì đó khác đã xóa tệp sau khi thử nghiệm [ cho nó nhưng trước khi rm xóa tệp đó, thì bạn sẽ quay trở lại với sự thất bại lần nữa).

Là một sang một bên, -- s khiến tên tệp được coi là chữ ngay cả khi nó bắt đầu bằng dấu gạch ngang hàng đầu; bạn nên sử dụng những thói quen này nếu tên của bạn đến từ các biến hoặc không được kiểm soát chặt chẽ.

+0

Các tùy chọn này hoạt động rất tốt! Cảm ơn Charles !! – user7649922

+0

Giải pháp được đề xuất có thể không thực hiện chính xác các yêu cầu của câu hỏi. Sự khác biệt là trong các tập tin được bảo vệ ghi: Nếu tập tin tồn tại và được bảo vệ ghi, bạn sẽ nhận được một thông báo lỗi với giải pháp gốc của bạn, trong khi tập tin sẽ được âm thầm xóa bởi giải pháp Charles Duffys. – user1934428

+0

@ user1934428, tôi không thấy yêu cầu trong câu hỏi rằng thay đổi này trong các biện pháp đối phó hành vi. Bạn có thể đánh vần nơi nó được đưa ra không? –

1
if [ ! -f 'absolute path of file' ] 
then 
    echo "File does not exist. Skipping..." 
else 
    rm 'absolute path of file' 
fi 

Nếu bạn sử dụng như sau thì nó sẽ hoạt động.

+0

Vì OP đang cố gắng điều kiện hóa 'rm', so với' echo', logic dường như bị đảo ngược ở đây. Và không cần phải có con đường tuyệt đối. –

+0

Cảm ơn Charles !. Tôi cập nhật nó để thêm thông tin đăng nhập xóa tệp. Biểu thức if là để kiểm tra nếu tập tin không tồn tại sau đó bỏ qua và in một tuyên bố chỉ để theo dõi nếu bất kỳ tập tin bị bỏ qua. –

+0

Rajesh, tôi đã thử sử dụng đề xuất, tuy nhiên, tôi nhận được lỗi sau: [: missing ']' Tôi sẽ thử phương pháp tiếp cận của bạn cũng như Charles! – user7649922

0

Chạm vào tệp trước tiên, thao tác này sẽ tạo tệp nếu không có, nhưng chỉ thay đổi dấu thời gian nếu nó hiện tại.

touch filename && rm filename 

Ít hiệu quả hơn nhưng dễ nhớ.

Các vấn đề liên quan