파일이 없으면 rm 옵션이 실패합니다.

파일이 없으면 rm 옵션이 실패합니다.

GNU coreutils 8.12.197-032bb 페이지에서는 man또는 옵션을 "존재하지 않는 파일을 무시하고 메시지를 표시하지 않음"으로 설명합니다. 이 옵션이 없으면 기존 파일을 모두 삭제하고 메시지를 표시하지 않으며 지정된 파일이 없으면 0이 아닌 종료 코드를 반환합니다. 제 생각에는rm-f--force다음과 같은 경우 파일을 보관하세요.어느지정한 파일이 존재하지 않습니다. 이를 수행하는 가장 쉬운 방법은 무엇입니까?

사용 사례는안전: 존재하지 않는 파일을 삭제하려고 하면 명령에 잘못된 기대 사항(또는 단순 오류)이 있기 때문일 수 있습니다. 예를 들어유명한rm -rf /usr /lib/nvidia-current/xorg/xorg이는 여러 가지 방법으로 피할 수 있습니다. 그 중 하나는 이와 같은 옵션이고(분명히 사용자가 놀라운 우연의 일치로 디렉토리를 가지고 있지 않는 한 /lib/nvidia-current/xorg/xorg), 다른 하나는 다음과 같습니다.더 많은 인용문 사용™. 그러나 인용만으로는 충분하지 않습니다. 예를 들어, 다음을 고려하십시오 ssh host '/bin/rm some paths; /bin/bash foo.sh'. 세미콜론을 잊어버리거나 거의 모든 다른 기호(콜론이나 쉼표 등)를 삽입하면 /bin/bash및 가 제거됩니다 ~/foo.sh.

답변1

나는 다음과 같은 것을 사용합니다 :

mkdir DELETE && mv "some" "paths" DELETE && rm -rf DELETE

단일 경로의 경우:

mv /some/path DELETE && rm -rf DELETE

rm command더 나은 방법은 별도의 명령줄에 다음을 입력하는 것입니다 mv /some/path DELETE Enter rm -rf DELETE Enter. 이렇게 하면 rm셸 기록에 기록되는 유일한 명령은 이라는 이름의 파일 이므로 이전 버전의 파일을 삭제하는 경우 실수로 잘못된 횟수를 눌러 새 버전이 삭제되는 DELETE일이 없습니다 .UpEnter

조금 자동화하고 싶다면:

mv_to_DELETE () {
  mkdir DELETE &&
  mv -- "$@" DELETE/
}
mv_to_DELETE "some" "paths"
rm -rf DELETE

답변2

그것은 마치

paths=("some" "paths")
for path in "${paths[@]}"
do
    [ -e "$path" ] || exit 1
done

우선, rm각 명령 앞의 명령은 훨씬 더 복잡하며 Bash 배열에 따라 다릅니다.

답변3

for path in "some" "paths"
do
    [ -e "$path" ] || exit 1
done

이식성이 더 높지만 루프 및 명령의 경로 목록을 복사하는 것을 의미합니다 rm. 모든 경로를 동일한 문자열 변수에 저장한다는 것은 스크립트가 더 이상 IFS파일 이름의 어떤 문자도 지원하지 않는다는 것을 의미합니다.

관련 정보