기존 디렉터리를 덮어쓰시겠습니까?

기존 디렉터리를 덮어쓰시겠습니까?

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

이 경우 mkdirrm명령은 필요한 작업을 수행하고 함께 잘 작동합니다. 왜냐하면 는 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>

이렇게 하면 제거하려는 항목이 파일이 아닌 디렉터리인지 확인됩니다.

  1. -d해당 이름의 디렉터리가 이미 존재하는지 확인하세요. 그렇다면 삭제하세요.

  2. -f이 이름을 가진 파일이 없는지 확인하십시오. 그렇다면 오류 메시지를 인쇄하고 종료하십시오.

  3. 새 디렉터리를 생성하고 성공을 에코하거나, 실패하면 에코가 실패합니다.

관련 정보