간결한 버전:
나는 플래그를 사용할 때 -f
플래그의 동작을 얻는 방법을 찾고 있습니다.rm
rmdir
긴 버전:
각 명령이 완료 후 작업 디렉터리를 정리해야 하는 병렬 프로세스를 실행하고 있습니다. 동일한 작업 디렉터리에서 명령을 실행할 수 있으므로 rmdir -p --ignore-fail-on-non-empty
다른 작업자가 아직 사용 중인 디렉터리를 작업자가 삭제하는 것을 방지하는 데 적합합니다. 유일한 문제는 동일한 디렉터리의 마지막 두 작업자가 동시에 완료될 때 발생하는 것 같습니다. 그런 다음 작업자 중 한 명이 패배하고 rmdir
"해당 파일 또는 디렉터리가 없습니다"라는 오류를 반환합니다.
rmdir
with처럼 문제가 아닌 것을 무시할 수 있는 방법이 있나요 ?rm
-f
( rm
실제로 다른 솔루션이 될 수 있는 옵션이 있지만 유형 동작을 -d
얻을 수 있는 방법은 없습니다 . 이는 어쨌든 모든 버전에 보편적이지 않으므로 이 접근 방식을 피하는 것이 가장 좋습니다.)-p --ignore-fail-on-non-empty
rm
-d
rm
답변1
먼저 디렉터리가 존재하는지 확인할 수 있습니다.
[ -d "$tmpdir" ] && rmdir -p --ignore-fail-on-non-empty "$tmpdir"
두 작업이 정확히 동시에 디렉터리 삭제를 시작하는 경우(TOCTOU 취약점: 둘 다 테스트하고 디렉토리를 살펴본 다음 둘 다 삭제를 시도하지만 불가능할 수도 있습니다.
rmdir
또는 발생할 수 있는 모든 오류를 무시할 수 있습니다 .
rmdir -p --ignore-fail-on-non-empty "$tmpdir" 2>/dev/null || true
또는 자신만의 프로그램을 만들어 디렉터리를 삭제하되 "파일이 존재하지 않습니다" 오류를 무시하세요. 예를 들어 Perl을 사용하면 다음과 같습니다.
perl -le 'if (not rmdir($ARGV[0]) and not $!{ENOENT}) {
warn "rmdir: $!\n"; exit 1; }' "$tmpdir"