foo
에 디렉토리 이름이 있습니다 ~/Desktop
. 같은 이름과 같은 위치에 터미널에서 디렉터리를 만들고 싶다고 가정해 보겠습니다. 시도했을 때 mkdir
오류가 발생했습니다.
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
foo
말이 되지만, 존재한다면 교체하고 싶습니다 . 나는 샅샅이 살펴보았다man mkdir
하지만 그렇게 할 수 있는 옵션은 없습니다.
그렇다면 foo
디렉토리를 덮어쓰는 방법은 무엇입니까?
mkdir
왜 이 작업을 수행할 수 있는 옵션이 없나요 ?
답변1
목표가 다음과 같은 한 줄 명령을 실행하는 것이라면:
~/Desktop/foo
이미 존재하는 경우 디렉터리를 제거하고 다시 만듭니다 .~/Desktop/foo
디렉토리가 아직 존재하지 않는 경우 디렉토리를 생성하십시오 .
그런 다음 다음을 사용할 수 있습니다.
rm -r ~/Desktop/foo; mkdir ~/Desktop/foo
;
개행 문자와 동일하지만 한 줄에 여러 명령을 실행할 수 있습니다(예: "단일 명령").
- 제거하려는 디렉터리에 읽기 전용 파일이 포함되어 있을 수 있는 경우
-f
사용자에게 대화형으로 메시지를 표시하지 않고 해당 파일을 제거하려면 플래그가 필요합니다. 괜찮습니다. 하지만 특히 주의하는 것이 좋습니다rm -rf ...
. 보다man rm
자세한 내용은. rm
다음 명령이 필요합니다 .마치다명령이 실행되기 전에mkdir
; 이것이;
대신에 사용하는 이유입니다&
. (이전 명령은&
백그라운드에서 비동기적으로 실행됩니다.)- 명령이 성공
mkdir
하면 실행할 명령이 필요합니다 . 이것이 대신에rm
사용하는 이유입니다 .;
||
mkdir
명령이 실패할 때 실행하려면 명령이 필요합니다rm
. 일반적으로 실패는 디렉터리가 아직 존재하지 않음을 의미합니다. 이것이;
대신에 사용하는 이유입니다&&
.- 디렉터리가 이미 존재하는 경우에도 명령
rm
이 실패할 수 있습니다. 이 경우 명령mkdir
도 실패하지만 오류 메시지는 의미가 있으며foo
디렉터리를 생성하기 전에 의 존재를 확인하는 중간 단계를 추가할 필요가 없을 것입니다.
보다3.2.3 명령어 목록에서배쉬 참조 매뉴얼;
, &
, ||
및 &&
연산자 에 대한 자세한 내용과 설명을 보려면
처럼무루가 제안했다(그리고Rinzwind가 자세히 설명함),꼭 살펴보시길 권합니다rsync
귀하의 백업 요구 사항을 충족하는지 확인하십시오. 에 대한 몇 가지 유용한 추가 가이드가 있습니다.rsync 문서 페이지, 게다가이 우분투 rsync 가이드.
왜 mkdir에 이 옵션이 없나요?
mkdir
디렉토리를 생성합니다("mk""만들다"를 뜻한다). 또한 디렉터리와 그 안의 모든 파일을 반복적으로 삭제하는 것은 좋지 않습니다.최소한의 놀라움의 원리데이터 손실로 이어질 가능성이 있는 방식입니다.
rmdir
(디렉토리가 아닌) 파일이 있는 디렉터리도 제거하지 않습니다.rm
-r
파일을 제거할 것으로 예상 되므로 의미가 있는 옵션이 있습니다 rm
(이것이 목적이므로 고유한 위험은 직관적이며 사용자는 일반적으로 rm
명령을 실행할 때 주의해야 한다는 것을 알고 있습니다).
답변2
아니요, 요청한 작업을 수행하는 단일 명령은 없습니다.
왜?
이것이 유닉스 철학입니다. 한 가지 일을 잘 수행하는 프로그램을 작성하세요. 함께 작동하는 프로그램을 작성하세요. 1
이 경우 mkdir
및 rm
명령은 필요한 작업을 수행하고 함께 잘 작동합니다. 왜냐하면 는 rm -r
디렉토리도 삭제하므로 후속 명령은 mkdir
디렉토리를 생성하기 때문입니다.
1유닉스 프로그래밍의 예술, Eric S. Raymond는 Doug McIlroy를 인용했습니다.
답변3
디렉토리를 제거하는 명령은 입니다 rm
. 따라서 2개의 명령이 필요합니다.
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
;
주석에 표시된 대로 (= 첫 번째가 실패하더라도 둘 다 수행) 또는 &&
(= rm이 실패하지 않는 경우 mkdir만) 로 연결할 수 있습니다 .
디렉토리를 제거하기위한 것 -r
입니다. 첫 번째 명령은 또한 디렉터리의 모든 내용을 제거합니다. 그것이 당신의 의도가 아니라면 rm과 mkdir 모두 당신이 찾고 있는 것이 아닙니다: 권한은 chmod
및 입니다 chown
.
왜 mkdir에 이 옵션이 없나요?
모호. mkdir
디렉토리를 만든다는 뜻입니다. 디렉토리를 제거하거나 만들지 마십시오. 그리고 이 명령은 내용을 삭제하기 위한 것이므로 디렉터리를 제거할 rm
필요가 없습니다 .rmdir
답변4
가장 깔끔한 방법으로 이를 수행하려면 다음을 사용합니다.
create_clean_directory(){
dir_name=$1
if [ -d "$dir_name" ]; then
echo "Removing $dir_name"
rm -rf "$dir_name"
elif [ -f "$dir_name" ]; then
echo "File with this name already exists, not a directory."
exit
fi
if mkdir "$dir_name"; then
echo "Clean directory created: $dir_name"
return 0
else
echo "Creating directory failed: $dir_name"
return 1
fi
}
그리고 그것을 사용하려면:
create_clean_directory <dir_name>
이렇게 하면 제거하려는 항목이 파일이 아닌 디렉터리인지 확인됩니다.
-d
해당 이름의 디렉터리가 이미 존재하는지 확인하세요. 그렇다면 삭제하세요.-f
이 이름을 가진 파일이 없는지 확인하십시오. 그렇다면 오류 메시지를 인쇄하고 종료하십시오.새 디렉터리를 생성하고 성공을 에코하거나, 실패하면 에코가 실패합니다.