다른 이름으로 이미 존재하는 디렉토리를 생성하는 방법

다른 이름으로 이미 존재하는 디렉토리를 생성하는 방법

내 홈 디렉터리에 "A"라는 디렉터리를 만들고 싶지만 그러한 디렉터리가 이미 존재하는지 모르겠습니다. 디렉토리가 존재하지 않는 경우 디렉토리를 생성하는 명령을 작성하고 싶습니다. 그러나 디렉터리가 존재하는 경우 명령은 동일한 이름을 가진 새 디렉터리를 생성하고 디렉터리 이름을 변경하기 위한 작은 추가 항목을 추가합니다. 작은 추가는 무작위여야 합니다. 즉, 명령을 실행할 때마다 다른 추가를 받게 됩니다. 예를 들어, 이 명령은 "A15" 또는 "A7" 디렉터리 또는 "A" 대신 이러한 추가 디렉터리를 만듭니다. 추가된 새 디렉터리가 존재하지 않는 것으로 가정할 수 있습니다. 이 명령은 원래 디렉터리 "A"가 존재하지 않지만 성공적으로 생성된 경우 !DONE 메시지를 인쇄하거나 "디렉터리 존재" 메시지를 인쇄합니다. 새 이름 A05가 생성되었으며 여기서 A05는 새 이름입니다.

답변1

bash" 스크립트 없이"는 일련의 명령이나 편리한 쉘 기능을 사용하는 것을 의미한다고 가정합니다 . 편리한 쉘 기능을 알려드리겠습니다.

이 함수는 주어진 이름으로 디렉터리를 생성하려고 시도하고 디렉터리가 오류 없이 생성될 때까지 다른 숫자 접미사를 사용하여 다시 시도합니다. 숫자 인덱스는 1부터 99까지의 순서로 테스트됩니다. 숫자 범위를 초과하면 진단 메시지가 출력되고 디렉터리가 생성되지 않습니다. 디렉토리가 생성되면 해당 경로 이름이 표준 출력에 기록됩니다.

makedir () {
    local name="$1"
    local suffix=

    until mkdir -- "$name$suffix" 2>/dev/null; do
        suffix=$(( suffix + 1 ))
        if [ "$suffix" -eq 100 ]; then
            echo 'Cannot create directory' >&2
            return 1
        fi
    done

    printf '%s\n' "$name$suffix"
}

이는 명령이 성공할 until때까지 반복적으로 사용됩니다 . 카운터가 100에 도달 mkdir하면 오류 스트림에 메시지가 출력되고 함수는 0이 아닌 종료 상태를 반환합니다.suffix

이 함수 정의는 일반적으로 별칭을 추가하는 곳에 추가할 수 있습니다. 그러면 다음 셸 세션에서 사용할 수 있습니다.

1~99 범위에서 단조롭게 증가하는 숫자 대신 난수를 원하는 경우:

makedir () {
    local name="$1"
    local tries=0
    local suffix=

    until mkdir -- "$name$suffix" 2>/dev/null; do
        tries=$(( tries + 1 ))
        if [ "$tries" -eq 100 ]; then
            echo 'Cannot create directory' >&2
            return 1
        fi
        suffix=$RANDOM
    done

    printf '%s\n' "$name$suffix"
}

이것은거의$RANDOM동일한 기능이지만 정수가 되는 접미사 로 사용됩니다 . 이전과 마찬가지로 함수가 100번의 시도 이내에 디렉터리를 생성할 수 없으면 종료됩니다.

이것이 임시 디렉토리를 생성하는 것이라면 mktemp -d일부 홈브류 항목 대신 사용하는 것이 더 좋습니다. 기본적으로 다음 디렉터리의 이름이 제공됩니다 /tmp.

tmpdir=$( mktemp -d )

# Do some work beneath "$tmpdir".

# Then...
rm -r "$tmpdir"

관련 정보