답변:
파일이 있는지 확인하지 말고 제거하십시오.
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가 작성됩니다. 존재하지 않을 것으로 예상되는 다음 명령을 실행하기 전에. 이것을 시도하는 것은 고전적인 경쟁 조건입니다. 하지마
rm /p/a/t/h 2> /dev/null
echo $?
파일이 존재하지 않으면 리턴 코드 ( )를 0으로 유지 하지 않습니다. 그러면 기존 파일이 아닌 파일을 삭제하려고했기 때문에 Jenkins가 일종의 작업이 실패하게됩니다.
noclobber
bash 와 같은 셸 관련 마술을 시도 하거나 기존 파일을 chmoding하여 파일이 존재하는 경우 경로 재 지정이 실패합니다 (경쟁 조건을 피하지 않음), 그러나 할 일은 버그를 더 미묘하게 만드는 것입니다.
내가 사용한 또 다른 한 줄 명령은 다음과 같습니다.
[ -e file ] && rm file
파일이 존재하는지 여부를 확인하는 단계를 무시하려면 상당히 쉬운 명령을 사용하면 파일이 존재하면 파일을 삭제하고 존재하지 않는 경우 오류를 발생시키지 않습니다.
rm -f xyz.csv
-f
오류가 발생 하지 않는다고 설명하지 않았습니다 . 이 답변이 도움이되었습니다. 감사합니다.
이런 식으로 작동합니다
#!/bin/sh
if [ -fe FILE ]
then
rm FILE
fi
-f 일반 파일인지 확인
-e 파일이 존재하는지 확인
자세한 내용 은 if 소개
편집 : -f와 함께 사용되는 -e는 중복이므로 -f 만 사용하면 작동합니다.
-a
더 이상 사용되지 않습니다 -e
. 대신 사용하십시오.
-f
.
-e
in -fe
은 중복되어 -f
있으며 , 내가 아는 한 파일의 존재를 확인합니다.
if [ $( ls <file> ) ]; then rm <file>; fi
또한 >
대신 출력을 리디렉션 >>
하면 이전 파일을 덮어 씁니다.
file
다음과 같은 경우 에 중단됩니다5 -lt 2
rm $my_file
. 어떤 쉘을 사용하고 있습니까?