내용이 비어 있는 디렉토리를 원 mydir
하지만 이미 존재하는지, 언제 존재하는지, 비어 있는지 미리 알 수 없습니다. 그래서 내 접근 방식은
mkdir -p mydir
rm -f mydir/*
어떤 결함이 있나요? 더 나은 솔루션은 무엇입니까?
답변1
결함은 디렉토리의 자동 강제 삭제를 사용하고 있다는 것입니다. 물론 해당 내용을 삭제하려면 자동 강제 삭제가 필요합니다.재귀적디렉터리를 삭제합니다. 스크립트의 보안 취약점에 노출됩니다.
--one-file-system
예를 들어 로고를 확인해 보세요 rm
. 아마도 설치된 파일 시스템의 모든 파일을 삭제하고 싶지는 않을 것입니다 mydir
. 따라서 해당 플래그를 포함해야 합니다(그런데 약어가 없습니다).
또한 번들 설치는 어떻습니까? (참조 man mount
및 검색 bind
.) 기술적으로 이러한 파일은 동일한 파일 시스템에 있습니다. rm -rf
이 파일을 어떻게 처리합니까? 모두 삭제되나요? 이는 원하는 것이 아닐 수도 있지만 이를 조사하고 rm
바인드 마운트와 관련된 동작을 테스트해야 합니다. 아마도 내가 생각하지 못한 다른 극단적인 경우가 많이 있을 것입니다.
이 모든 문제는 당신이 하지 않기 때문에 발생합니다진짜"디렉토리와 그 내용을 삭제"하려면 어떻게 해야 합니까?실제로내가 원하는 것은빈 디렉토리에서 작동합니다.
일반적인 원칙은 다음과 같습니다. 무언가를 지정할 때다른당신이 특별히 원하는 것이 아니고, 이것이 당신이 원하는 것을 얻는 방법이라고 생각하기 때문에 불필요한 복잡성을 초래하는 경우가 많습니다. 해야 할 일은 지정하는 방법을 찾는 것입니다.당신은 무엇을 원합니까?그런 다음 명시적으로 지정합니다. *
Jeff Schaller가 의견에서 지적했듯이 더 나은 해결책은 mktemp
실제로 이 목적을 위해 설계된 를 사용하는 것입니다. 구체적으로 다음과 같습니다 man mktemp
.
Create a temporary file or directory, safely, and print its name.
디렉토리를 생성하는 가장 간단한 방법 mktemp
은 다음과 같습니다.
mydir="$(mktemp -d)"
그런 다음 다음과 같이 파일을 복사할 수 있습니다.
cp somefile "$mydir/"
스크립트 끝에서 디렉터리 작업이 완료되면 다음을 수행할 수 있습니다.안전하게다음 명령을 사용하여 해당 항목(및 입력한 내용)을 삭제합니다.
rm -rf "$mydir"
*이 원칙의 또 다른 예는 sed
명령을 사용하여 필드 기반 또는 열 기반 파일을 처리하는 것입니다. 당신은 그것을 할 수 있습니다...그러나 당신은 지정할 수 있습니다정확히원하는 것을 awk
훨씬 덜 복잡하게 사용하면 됩니다.
답변2
mkdir
실패해야 하기 때문에 실패합니다. 이것은 좋은 일입니다. 실패한 명령은피복재. 테스트 가능한 오류 코드를 올바르게 반환합니다. 그래서 간단한 것은 그것을 테스트하는 것입니다.
:& cd -P "${TMPDIR:-/tmp}" || exit
x=$(((z=($$+$!)/2+1000)-1001))
until mkdir -m a=,u=rwx "work.$0.$((x+=1))" &&
cd -- "work.$0.$x"
do [ "$x" -lt "$z" ] || ! break
done 2>/dev/null &&
WORK=$PWD exec 9<.