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


11

에 디렉토리 이름이 foo있습니다 ~/Desktop. 이름과 위치가 같은 터미널에서 디렉토리를 만들고 싶다고 가정 해보십시오. 내가 시도했을 때 mkdir오류가 발생했습니다.

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

그게 말이 되겠지만 foo존재하는 경우 교체하고 싶습니다 . 나는 보았다man mkdir 그렇게하는 옵션은 없습니다.

덮어 쓰는 방법 foo 디렉토리 무엇입니까?

mkdir이것을 할 수있는 옵션이 없습니까?


foo모든 내용을 삭제하는 것처럼 교체 하시겠습니까? 디렉토리가 존재하는지 무시 mkdir하는 -p옵션이 있습니다.
muru

4
따라서 실수로 같은 이름으로 새 디렉토리를 만들 때 디렉토리의 모든 파일을 삭제하는 명령이 필요하십니까? 그리고 왜 이것이 옵션이 아닌지 궁금하십니까? 지금 농담하는 거지?
Marty Fried

downvoters는 왜 기존 디렉토리를 삭제하는 하나의 명령을 요구하는지 명확하게 설명합니다
nux

1
@ nux 나에게 질문은 말이되지 않습니다 ... 왜 디렉토리를 삭제하고 다시 만들고 싶습니까? 디렉토리에 필요한 모든 명령이 있습니다. mkdir에는 제거 / 재 작성 옵션이 필요하지 않습니다.
Rinzwind

1
논리적 인 질문을하고 있다면 이것이 범죄입니까?
nux

답변:


21

목표가 다음과 같은 한 줄 명령을 실행하는 것입니다.

  • 디렉토리 ~/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 목록 에서 배쉬 참조 설명서를 에 대한 자세한 내용과 설명은 ;, &, ||, 및 &&운영.

으로 muru 제안 (그리고 Rinzwind이 정교 ), 나는 당신이 들여다 권장합니까rsync 그것은 당신의 백업 요구를 충족되는지 확인. 이 우분투 rsync 안내서 뿐만 아니라 rsync 문서 페이지 에 유용한 추가 안내서가 있습니다.

mkdir에이 옵션이없는 이유는 무엇입니까?

mkdir디렉토리를 작성합니다 ( "mk" 는 "make"를 나타냄). 또한 재귀 적으로 디렉토리를 삭제하면 디렉토리의 모든 파일이 나빠질 수 있습니다. 데이터 손실로 이어질 수있는 가장 놀라운 원리를 위반하기 때문입니다 .

rmdir디렉토리가 아닌 파일이 들어있는 디렉토리조차 제거하지 않습니다. rm는 파일을 제거 할 것으로 예상 -r되므로 옵션이 있습니다. 즉, rm그 목적으로 인해 고유 한 위험이 직관적이며 사용자는 일반적으로 rm명령을 실행할 때주의해야합니다 .


+1 우수 이 답변은 구문을 설명하는 데있어 그 이상입니다. 스택 교환 사이트에서 더 심오한 것이 있습니다. 이 답변에는 많은 황금 덩어리가 있습니다.
Govind Rai

7

아니요, 원하는 것을 수행하는 단일 명령은 없습니다.

왜?

이것이 유닉스 철학입니다. 한 가지 일을하고 잘하는 프로그램을 작성하십시오. 함께 일할 프로그램을 작성하십시오. 1

이 경우 mkdirand rm명령은 필요한 작업을 수행하고 함께 작동 rm -r하므로 디렉토리도 삭제되므로 이후 mkdir에 디렉토리가 작성됩니다.

1 유닉스 프로그래밍 기술 , Eric S. Raymond는 Doug McIlroy를 인용했다.


지금은 좋은 답변입니다. 검색하겠습니다
nux

3

디렉토리를 제거하는 명령은 rm입니다. 따라서 두 가지 명령이 필요합니다.

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

주석에서 볼 수 있듯이 ;(= 첫 번째 실패하더라도 두 가지 모두 수행) 또는 &&(= rm이 실패하지 않은 경우에만 mkdir 만) 연결 할 수 있습니다.

-rDIRS을 제거하기위한 것입니다. 첫 번째 명령은 디렉토리의 모든 내용을 제거합니다. 그것이 당신의 의도가 아니라면 rm과 mkdir 모두 당신이 찾고있는 것이 아닙니다 : permissions are chmodand chown.

mkdir에이 옵션이없는 이유는 무엇입니까?

모호. mkdir디렉토리 만들기를 의미합니다. 디렉토리를 제거하고 만들지 마십시오. 그리고 이후 rm명령이 삭제 물건입니다 필요가없는 rmdir디렉토리를 제거 할 수는.


알지만, 하나의 명령을 의미합니다. 편집 한 내용을 볼 수 있습니다.
nux

먼저 디렉토리를 다시 작성해야하는 이유를 설명하십시오. 그것은 나에게 이해가되지 않습니다.
Rinzwind

내 필요가 이해가 되나, 어떻게 궁금해? 그것은 나를 위해 이해가 :)
nux

@ nux 아니오 그렇지 않습니다. 그리고 mkdir의 관리자는 왜 그런지 이해하지 못합니다.;) 당신이 원하는 것은 쓸모없고 가치가 없습니다.
Rinzwind

같은 이름의 foo를 사용하여 새 디렉토리에 백업하기위한 스크립트를 작성하고 있고 공간을 줄이기 위해 존재하는 경우이를 대체 할 수 있도록하려면
nux

1

가장 깨끗한 방식으로 수행하려면 다음을 사용하십시오.

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. 새 디렉토리를 작성하고 에코 성공 또는 실패한 경우 에코 실패

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.