shell script để xóa một tập tin nếu nó đã tồn tại


183

Tôi đang làm việc trên một số thứ mà tôi đang lưu trữ dữ liệu trong một tệp. Nhưng mỗi lần tôi chạy tập lệnh, nó sẽ được thêm vào tập tin trước đó.

Tôi muốn giúp đỡ về cách tôi có thể xóa tệp nếu nó đã tồn tại.


3
Kiểm tra xem tập tin có tồn tại ... và sau đó gọi rm $my_file, phải không? Bạn đang sử dụng vỏ gì?
Chris Sprague

Câu trả lời:


184

Đừng bận tâm kiểm tra nếu tập tin tồn tại, chỉ cần cố gắng loại bỏ nó.

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

Lưu ý rằng lệnh thứ hai sẽ thất bại (trả về trạng thái thoát khác không) nếu tệp không tồn tại, nhưng lệnh đầu tiên sẽ thành công nhờ tùy chọn -f(viết tắt là --force). Tùy thuộc vào tình huống, đây có thể là một chi tiết quan trọng.

Nhưng nhiều khả năng, nếu bạn đang nối thêm vào tệp đó là do tập lệnh của bạn đang sử dụng >>để chuyển hướng một cái gì đó vào tệp. Chỉ cần thay thế >>bằng >. Thật khó để nói vì bạn đã cung cấp không có mã.

Lưu ý rằng bạn có thể làm một cái gì đó như thế test -f /p/a/t/h && rm /p/a/t/h, nhưng làm như vậy là hoàn toàn vô nghĩa. Hoàn toàn có thể thử nghiệm sẽ trả về đúng nhưng / p / a / t / h sẽ không tồn tại trước khi bạn cố xóa nó, hoặc tệ hơn là thử nghiệm sẽ thất bại và / p / a / t / h sẽ được tạo trước khi bạn thực thi lệnh tiếp theo, nó sẽ không tồn tại. Cố gắng đây là một điều kiện đua cổ điển. Đừng làm điều đó.


5
Điều này không hữu ích nếu họ cần biết nếu nó tồn tại và đã bị xóa. Ăn stderr không cung cấp điều đó. Không xử lý sự tồn tại không cho phép bạn chạy một kịch bản rộng hơn mà không bị lỗi.
uchuugaka

@uchuugaka Đây là một giải pháp đơn giản khi bạn không quan tâm nếu có tập tin ở đó, tất cả những gì bạn muốn là đảm bảo rằng nó không có ở đó.
Lukas Liesis

Những câu trả lời hay nên được đưa ra và đầy đủ về các tác dụng phụ là sự khái quát hóa thông điệp của tôi, nhưng các kịch bản shell thường muốn biết cái gì được tìm thấy hoặc không được tìm thấy và cái gì không hoặc không được xử lý.
uchuugaka

rm /p/a/t/h 2> /dev/nullsẽ không giữ mã trả về ( echo $?) là 0 nếu tệp không tồn tại. Điều đó sẽ khiến loại công việc của Jenkins thất bại chỉ vì chúng tôi đã cố xóa một tệp không tồn tại.
ViFI

@uchuugaka - Tôi đã tránh trả lời bình luận này khá lâu, nhưng nó cần được giải quyết. Kiểm tra nếu tập tin tồn tại trước khi bạn xóa nó luôn là một ý tưởng tồi. Xem đoạn cuối câu trả lời của tôi. Có một điều kiện chủng tộc vốn có mà đơn giản là không thể tránh được bằng cách làm điều đó. Nếu bạn không muốn ghi đè lên một tệp hiện có, bạn có thể thử một số phép thuật cụ thể về vỏ (như noclobbertrong bash) hoặc có thể chmod-ing tệp còn tồn tại để chuyển hướng thất bại nếu tệp tồn tại (không tránh điều kiện cuộc đua), nhưng tất cả những gì sẽ làm là làm cho các lỗi tinh tế hơn.
William Pursell

127

Một lệnh khác tôi đã sử dụng là:

[ -e file ] && rm file

11
Hay cách khác: [ ! -e tập tin] || tập tin rm. Phiên bản này trả về 0 thay vì một số lỗi.
nawfel bgh

@nawfelbgh Cảm ơn, điều này rất tốt cho việc xâu chuỗi trong một kịch bản dài hơn.
Abe

83

Bạn có thể sử dụng điều này:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

4
Đây phải là câu trả lời được lựa chọn.
ingernet

Đơn giản và dễ đọc và cũng đảm bảo rằng echo $?không cung cấp 1 nếu tệp không tồn tại.
ViFI

Nếu cần, bạn cũng có thể làm điều này như một lớp lót, xem câu trả lời của tôi dưới đây.
nbeuchat

65

Nếu bạn muốn bỏ qua bước để kiểm tra xem tệp có tồn tại hay không, thì bạn có thể sử dụng một lệnh khá dễ dàng, nó sẽ xóa tệp nếu tồn tại và không gây ra lỗi nếu nó không tồn tại.

 rm -f xyz.csv

1
Đây chỉ là một bản sao của một phần của câu trả lời được đánh giá cao nhất, từ năm 2015.
tha thứ vào

16
câu trả lời chính không giải thích rằng với -fnó sẽ không gây ra lỗi. Câu trả lời này đã giúp tôi, cảm ơn bạn.
Doug

Đồng ý với Doug mặc dù đây có vẻ là một trường hợp sử dụng tốt cho việc chỉnh sửa phản hồi giống như wiki.
Philip

16

Một tập lệnh shell shell để xóa một tập tin nếu nó đã tồn tại (dựa trên câu trả lời của Jindra Helcl):

[ -f file ] && rm file

hoặc với một biến:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

Một cái gì đó như thế này sẽ làm việc

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-f kiểm tra nếu đó là một tập tin thông thường

-e kiểm tra nếu tập tin tồn tại

Giới thiệu nếu biết thêm thông tin

EDIT: -e được sử dụng với -f là dự phòng, vì chỉ sử dụng -f nên cũng hoạt động


-ađược phản đối, sử dụng -ethay thế.
mziccard

xấu của tôi, cố định. Cảm ơn @mziccard
P1kachu

điều này sẽ ném lỗi trên các thư mục hoặc liên kết hoặc các tệp không bình thường khác. Nó là imho tốt hơn / an toàn hơn để sử dụng -f.
Jindra Helcl

1
đồng ý. Tuy nhiên, phần -etrong -felà dư thừa, -fcũng như kiểm tra sự tồn tại của tệp theo như tôi biết ..
Jindra Helcl

Nếu tôi chỉnh sửa, tôi sẽ chỉ tạo một bản sao từ câu trả lời của bạn, nhưng tôi sẽ chính xác nó
P1kachu

4

if [ $( ls <file> ) ]; then rm <file>; fi

Ngoài ra, nếu bạn chuyển hướng đầu ra của mình bằng >thay vì >>nó sẽ ghi đè lên tệp trước đó


3
đây không phải là một lớp lót, xin lỗi, nhưng @liwp_Stephen là một.
fiorentinoing

Ngay cả khi được trích dẫn chính xác, điều này sẽ phá vỡ nếu filenó giống như5 -lt 2
William Pursell
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.