디렉터리에 있는 모든 파일의 파일 이름에 있는 카운터를 바꿉니다.

디렉터리에 있는 모든 파일의 파일 이름에 있는 카운터를 바꿉니다.

카메라에서 하드 드라이브로 1000개의 파일을 가져온 후 파일 이름을 바꾸는 과정에서 사용되는 카운터가 0에서 시작하지 않는다는 것을 깨달았습니다. 결과적으로 파일 구조는 다음과 같습니다.

My vacation 2018-05-03 2345.jpg
My vacation 2018-05-03 2346.jpg
My vacation 2018-05-04 2347.jpg

인덱스가 0으로 시작하는 왁스의 모든 파일 이름을 일괄적으로 바꾸고 싶습니다.

My vacation 2018-05-03 0001.jpg
My vacation 2018-05-03 0002.jpg
My vacation 2018-05-04 0003.jpg

일괄 이름 바꾸기 파일 이름을 다루는 몇 가지 주제를 살펴보았습니다.다음에 추가카운터/인덱스(bash 루프) 또는 사용이름 바꾸기/이름 바꾸기하지만 내 경우에는 효과적인 해결책을 찾을 수 없습니다.

.*(\d\d\d\d\-\d\d\-\d\d){1}기본적으로 정규식을 사용하여 파일 이름의 일부를 설명 및 날짜와 일치시키고 끝에 접미사 카운터를 추가하고 싶습니다 .

답변1

그리고 zsh:

$ autoload -Uz zmv
$ zmv -n '(* )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'

(그런 다음 만족스러우면 삭제 -n(모의 실행)).

보다 구체적으로 일치하려면 파일 이름에 날짜(XXXX-XX-XX)가 포함되어야 합니다.

zmv -n '(* [0-9](#c4)(-[0-9](#c2))(#c2) )(<->)(.jpg)' '$1${(l[4][0])$(($3 - 2344))}$4'

또는

zmv -n '(* <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'

2344에서 숫자를 뺍니다. 또는 이미 존재하는 숫자의 값을 무시하고 순서대로 정렬하고 1부터 번호 매기기를 시작할 수 있습니다. 날짜 이전에 접두사가 변경될 때마다 번호를 다시 시작하려면 다음을 수행하면 됩니다.

$ typeset -A n=()
$ zmv -n '((*) <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$((++n[\$2]))}$4'
mv -- 'My other vacation 2021-01-05 0044.jpg' 'My other vacation 2021-01-05 0001.jpg'
mv -- 'My other vacation 2021-01-05 0045.jpg' 'My other vacation 2021-01-05 0002.jpg'
mv -- 'My other vacation 2021-01-05 0046.jpg' 'My other vacation 2021-01-05 0003.jpg'
mv -- 'My other vacation 2021-01-05 0047.jpg' 'My other vacation 2021-01-05 0004.jpg'
mv -- 'My other vacation 2021-01-05 0048.jpg' 'My other vacation 2021-01-05 0005.jpg'
mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg'
mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg'
mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'

답변2

\d+.파일 이름에서 점(.)이 뒤따르는 일련의 숫자를 점 (.)이 뒤따르는 4-0 패드 카운터 로 바꿔야 합니다 sprintf("%04d.", ++$c).

rename -n -- 'our $c; s/\d+\./sprintf("%04d.", ++$c)/e' *.jpg

제로 패딩이 없는 경우에는 필요하지 않으며 sprintf카운터와 포인트를 연결하기만 하면 됩니다. 조인 연산자도 점이므로

rename -n -- 'our $c; s/\d+\./++$c . "."/e' *.jpg

노트

-n제대로 작동하는지 확인되면 제거하세요.

일부 배포판에서는 rename이라고 불릴 수도 있습니다 perl-rename.

our $c;해결하는 것이다'전역 기호 '$c'에는 명시적인 패키지 이름이 필요합니다.'실수. 내 시스템에는 필요하지 않습니다... ́\(트)/ ́

답변3

#!/usr/bin/env bash                                                                                                                     

#My vacation 2018-05-03 2345.jpg
#My vacation 2018-05-03 0002.jpg

cdir="${1}";
filename_start="${2}";

# For every file.
for cfilename in ${cdir}/*; do
    # If its index starts with a 0.
    if [[ "${cfilename}" =~ "${filename_start} "[0-9]*-[0-9]*-[0-9]*" "[0] ]]; then
        # Change its name.
        mv "${cfilename}" "${cfilename}_my_addition";
        fi
    done

그런 다음 이 코드를 파일로 저장해야 합니다.
.sh로 끝나세요.

권한을 부여합니다.

chmod 700 rename_files.sh;

그런 다음 다음을 사용하여 실행할 수 있습니다.

./rename_files.sh;

답변4

제안된 모든 답변 외에도 일괄 이름 바꾸기 기능도 발견했습니다.이중 사령관매우 유용하고 내 요구에 적합했습니다.

이것은 내 설정입니다.

  • 파일 이름에 카운터를 추가합니다.[N][C]
  • 검색 및 바꾸기를 사용합니다.
    • 찾다:(\d{1,4})(\d{2,4})(\..{3,4}$)
    • 바꾸다:$2$3
  • 두 개의 확인란을 선택해야 합니다.정규식그리고교체 사용

즉시 미리보기는 파일 색인 재지정을 빠르게 조정하고 제어하는 ​​데 매우 유용한 기능입니다.

관련 정보