폴더 내의 디렉터리에 카운터 적용

폴더 내의 디렉터리에 카운터 적용

다음과 같은 폴더 구조가 있습니다.

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이 값은 해당 이름의 디렉터리가 나타날 때까지 증가합니다 .아니요존재하다. 그런 다음 사용하지 않은 번호를 사용하여 이름을 바꿉니다.

관련 정보