이미 존재하는 경우 파일을 제거하는 쉘 스크립트


183

파일에 데이터를 저장하는 일부 작업을하고 있습니다. 그러나 스크립트를 실행할 때마다 이전 파일에 추가됩니다.

파일이 이미 존재하는 경우 파일을 제거하는 방법에 대한 도움말이 필요합니다.


3
파일이 있는지 확인한 다음을 호출하십시오 rm $my_file. 어떤 쉘을 사용하고 있습니까?
Chris Sprague

답변:


184

파일이 있는지 확인하지 말고 제거하십시오.

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

파일이 존재하지 않으면 두 번째 명령은 실패하지만 (0이 아닌 종료 상태를 반환) 첫 번째 옵션 은 -f(short for --force) 옵션 으로 인해 성공 합니다. 상황에 따라 중요한 세부 사항이 될 수 있습니다.

그러나 파일에 추가하는 경우 스크립트가 >>파일로 파일을 리디렉션 하는 데 사용 하기 때문일 가능성이 큽니다 . 그냥 교체 >>와 함께 >. 코드를 제공하지 않았기 때문에 말하기가 어렵습니다.

과 같은 작업을 수행 할 test -f /p/a/t/h && rm /p/a/t/h 있지만 그렇게하는 것은 완전히 의미가 없습니다. 테스트가 true를 리턴 할 수도 있지만 / p / a / t / h는 제거하기 전에 존재하지 않거나 테스트가 실패하고 / p / a / t / h가 작성됩니다. 존재하지 않을 것으로 예상되는 다음 명령을 실행하기 전에. 이것을 시도하는 것은 고전적인 경쟁 조건입니다. 하지마


5
존재하고 삭제되었는지 알아야하는 경우에는 도움이되지 않습니다. stderr를 먹는 것은 그것을 제공하지 않습니다. 존재를 처리하지 않아도 실패없이 더 넓은 스크립트를 실행할 수 없습니다.
uchuugaka

파일이있을 경우 당신은 상관하지 않는 경우 @uchuugaka이 당신이 원하는 모든 그것의 있는지 확인하는 것입니다, 간단한 솔루션입니다 하지 가.
Lukas Liesis

부작용에 대해 좋은 대답이 나오고 완성되어야합니다. 부작용은 내 메시지의 일반화입니다. 그러나 셸 스크립트는 종종 발견되거나 발견되지 않은 것과 수행되는 것이 무엇인지 알고 싶어합니다.
uchuugaka

rm /p/a/t/h 2> /dev/nullecho $?파일이 존재하지 않으면 리턴 코드 ( )를 0으로 유지 하지 않습니다. 그러면 기존 파일이 아닌 파일을 삭제하려고했기 때문에 Jenkins가 일종의 작업이 실패하게됩니다.
ViFI

@uchuugaka-나는이 의견에 꽤 오랫동안 답변하지 않았지만 해결해야합니다. 파일을 삭제하기 전에 파일이 존재하는지 확인하는 것은 항상 나쁜 생각입니다. 내 답변의 마지막 단락을 참조하십시오. 이런 종류의 일을함으로써 피할 수없는 고유 한 경쟁 조건이 있습니다. 기존 파일을 덮어 쓰지 않으려면 noclobberbash 와 같은 셸 관련 마술을 시도 하거나 기존 파일을 chmoding하여 파일이 존재하는 경우 경로 재 지정이 실패합니다 (경쟁 조건을 피하지 않음), 그러나 할 일은 버그를 더 미묘하게 만드는 것입니다.
윌리엄 퍼셀

127

내가 사용한 또 다른 한 줄 명령은 다음과 같습니다.

[ -e file ] && rm file

11
또는 대안으로 : [! -e 파일] || rm 파일. 이 버전은 약간의 오류 대신 0을 반환합니다.
nawfel bgh

@nawfelbgh 감사합니다. 더 긴 스크립트를 체인으로 연결하는 데 좋습니다.
Abe

83

이것을 사용할 수 있습니다 :

#!/bin/bash

file="file_you_want_to_delete"

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

4
선택한 답변이어야합니다.
ingernet

간단하고 읽기 쉽고 echo $?파일이 존재하지 않으면 1을 제공하지 않습니다.
ViFI

필요한 경우 하나의 라이너 로이 작업을 수행 할 수도 있습니다. 아래 답변을 참조하십시오.
nbeuchat

65

파일이 존재하는지 여부를 확인하는 단계를 무시하려면 상당히 쉬운 명령을 사용하면 파일이 존재하면 파일을 삭제하고 존재하지 않는 경우 오류를 발생시키지 않습니다.

 rm -f xyz.csv

1
이것은 2015 년부터 최고 평점 답변의 일부에 불과합니다.
forgivenson

16
주요 대답은 -f오류가 발생 하지 않는다고 설명하지 않았습니다 . 이 답변이 도움이되었습니다. 감사합니다.
Doug

Wiki와 같은 응답 편집을위한 좋은 유스 케이스처럼 보이지만 Doug와 동의하십시오.
Philip

16

파일이 이미 존재하는 경우 파일을 제거하는 하나의 라이너 셸 스크립트 (Jindra Helcl의 답변에 따라) :

[ -f file ] && rm file

또는 변수와 함께 :

#!/bin/bash

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

13

이런 식으로 작동합니다

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-f 일반 파일인지 확인

-e 파일이 존재하는지 확인

자세한 내용 은 if 소개

편집 : -f와 함께 사용되는 -e는 중복이므로 -f 만 사용하면 작동합니다.


-a더 이상 사용되지 않습니다 -e. 대신 사용하십시오.
mziccard

내 나쁜, 고정. 감사합니다 @mziccard
P1kachu

디렉토리 나 링크 또는 기타 비정규 파일에 오류가 발생합니다. 사용하는 것이 좋습니다 -f.
Jindra Helcl 1

1
확인. 그래도 -ein -fe은 중복되어 -f있으며 , 내가 아는 한 파일의 존재를 확인합니다.
Jindra Helcl

내가 수정하면 답을 복제 할 것이지만, 정확하게 설명하겠습니다
P1kachu

4

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

또한 >대신 출력을 리디렉션 >>하면 이전 파일을 덮어 씁니다.


3
이것은 하나의 라이너가 아니며, 죄송하지만 @liwp_Stephen은 그 중 하나입니다.
fiorentinoing

제대로 인용하더라도, 이것은 file다음과 같은 경우 에 중단됩니다5 -lt 2
William Pursell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.