다음과 같은 폴더 구조가 있습니다.
drwxr-xr-x 2 root root 4096 Jun 30 21:34 dir_0.0.1_2
drwxr-xr-x 2 root root 4096 Jul 2 23:45 dir_0.0.1_1
-rw-r--r-- 1 root root 24 Jul 3 00:03 a.sh
drwxr-xr-x 2 root root 4096 Jul 3 00:04 dir_0.0.1_3
스크립트는 동일한 디렉토리에 다음 dir_0.0.1
이라는 이름의 새 디렉토리를 생성합니다 . a.sh
새로 형성된 디렉토리의 이름이 바뀌도록 스크립트에 카운터를 적용하려면 어떻게 해야 합니까 dir_0.0.1_4
?
답변1
zsh에서:
set -- dir_0.0.1_*(oe['REPLY=${REPLY##*_}']n[-1])
mv dir_0.0.1 dir_0.0.1_$(( ${1##*_} + 1 ))
이는 $1
위치 인수(여기서만 사용됨)를 와일드카드 확장으로 설정합니다 dir_0.0.1_*(oe['REPLY=${REPLY##*_}']n[-1])
.
- 파일 이름은 다음으로 끝나야 합니다.
dir_0.0.1_
- 그런 다음 파일 이름은
o
후속 표현식을 사용하여e[ ... ]
정렬 됩니다. _
마지막 밑줄 까지 가능한 한 많은 선행 문자를 제거하여 생성된 파일 이름 부분으로 정렬 키를 설정합니다.n
숫자순으로 정렬- 그런 다음 파일 이름 목록을 분할하여 마지막 요소(
[-1]
) 를 반환합니다.
현재 인덱싱된 가장 큰 파일 이름은 이제 에 있습니다 $1
. 숫자 확장자 내에서 숫자를 검색한 다음 $(( ))
(역시 선행 문자를 제거하여 _
) 1을 추가하고 앞에 정적 접두사를 붙입니다.
Bash에서는 파일 이름을 반복하고 수동으로 색인을 비교합니다.
# safe starting point
greatest=-1
for d in dir_0.0.1_*; do n=${d##*_}; [ "$n" -gt "$greatest" ] && greatest=$n; done
mv dir_0.0.1 dir_0.0.1_$(( greatest + 1))
Bash 루프 분석(실제로 sh와 호환 가능):
- 우리는 대략적으로 안전한 인덱스 시작점을 설정하는 것부터 시작합니다. 우리가 찾은 시작점보다 낮을 것이 보장됩니다.
for
와일드카드가 포함된 루프를 사용하여 각 디렉터리의 기존 디렉터리 이름을 가져옵니다.- 앞부분부터 마지막 밑줄까지 모두 제거하여 마지막에 인덱스를 캡처합니다.
- 인덱스를 테스트하여 현재 최고 인덱스보다 큰지 확인하세요. 그렇다면 최고 인덱스를 재설정하세요.
- 루프가 완료된 후 "top + 1" 값을 추가하여 디렉터리 이름을 바꿉니다.
또 다른 옵션은 사용되지 않는 인덱스를 찾을 때까지 인덱스에 대해 무차별 대입 루프를 수행하는 것입니다.
# set this to something you know exists
index=1
while [ -e dir_0.0.1_"${index}" ]; do index=$((index + 1)); done
mv dir_0.0.1 dir_0.0.1_"${index}"
$index
이 값은 해당 이름의 디렉터리가 나타날 때까지 증가합니다 .아니요존재하다. 그런 다음 사용하지 않은 번호를 사용하여 이름을 바꿉니다.