dir1을 생성하려고 mkdir에게 어떻게 말하고, 존재하지 않는 이름에 도달 할 때까지 이미 존재하는 경우 dir2 등을 만드시겠습니까?


13

끝에 e.x라는 숫자가있는 디렉토리를 만들고 싶습니다. "dir1"을 입력하고 존재하지 않는 디렉토리 이름에 도달 할 때까지 디렉토리가 이미 존재하는 경우 해당 번호를 증가시키고 Linux 명령 행에서 다음과 같이 한 줄로 입력해야합니다.

mkdir --increment dir$

그 일을 어떻게 하죠?

지금까지 나는 이것을 가지고있다 :

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

그러나 다음 dir 이름을 에코합니다. 재귀 적으로 명령을 실행해야합니다.

답변:


26

이것은 사용의 사소한 운동이다. while:

n=0
while ! mkdir dir$n
do
    n=$((n+1))
done

그러나이 사소한 메커니즘이 잘 확장되지 않는다는 것을 깨닫는 데는별로 생각하지 않습니다.

따라서 바퀴를 다시 만들고 모든 모서리를 다시 면도해야하는 대신 템플릿에서 약간 다른 방식으로 고유 한 임시 디렉토리를 만듭니다.

name=$(mktemp -d dirXXXXXXXXXXX)

숫자에 대한 이진 검색으로 충분할 수 있습니다.
Thorbjørn Ravn Andersen

휠 재교환 프로세스에서 시작하는 곳에서 면도 할 수있는 몇 가지 모서리가 있습니다. 최소한 파일 시스템을 기억하고 보안 및 병렬 처리를 고려해야합니다.
JdeBP

6

올바른 순서로 나열된 디렉터리를 점진적으로 만들려면 현재 날짜를 기준으로 이름이 지정된 폴더를 대신 사용해도됩니까?

DATE=$(date +%F)
mkdir "dir-$DATE"

다음과 같은 이름으로 디렉토리를 만듭니다. dir-2014-03-02 ( YYYY-MM-DD, 알파벳 순으로 나타납니다).

하루에 둘 이상의 디렉토리를 작성하는 경우 파일 이름에 현재 시간을 추가 할 수 있습니다. 만나다 man date 출력 형식을 조정하는 방법 date.


5

먼저 "가장 큰"dirname을 찾아 숫자를 얻고 그 값을 증가시킵니다.

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

이것은 좋은 생각이지만 병렬 처리가 쉽지 않습니다.
Thorbjørn Ravn Andersen

수백만 개의 디렉토리가없는 한, 병렬 처리는 시기상조의 최적화입니다.
glenn jackman

왜 필요한거야? printf 이리? 단순하지 않을 것입니다. echo 작업?
Ruslan

또한, 나는 dir[0-9]* 대신에 dir*.
Ruslan

1
너는 오해한다. 스크립트가 한 번에 여러 번 (여러 스레드, 여러 사용자 등) 실행될 수 있는지 여부에 대해 이야기합니다.
Thorbjørn Ravn Andersen

2

디렉토리가 항상 "dir1"에서 시작하고 $ dir *이라는 파일이 없다고 가정하면 (이 디렉토리는 모두 순차적으로 번호가 매겨진 디렉토리 임),이 한 개의 라이너로 도망 갈 수 있습니다 -

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

이것은 $ dir으로 시작하는 파일의 수를 세어 그 번호에 하나를 더하고 새 파일을 만듭니다.


0

다른 답변에 대한 부록 : 이름으로 올바르게 정렬하려면 dir이 필요한 경우 고정 길이로 앞에 오는 0으로 새 디렉토리 번호 (NUM)를 채울 수도 있습니다.

다음은 하나의 라인에 응축되거나 다른 솔루션 중 하나에 내장 될 수 있습니다.

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

이것은 NUM이 적어도 1 자리 길이로 시작하고 고정 길이를 초과하지 않는다고 가정합니다. 요구 사항에 따라 조정하십시오.

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