RENAME을 사용하여 여러 파일에 접두사를 추가할 때 문제가 발생합니다.

RENAME을 사용하여 여러 파일에 접두사를 추가할 때 문제가 발생합니다.

폴더에 있는 수백 개의 이미지 이름을 바꾸려고 할 때 다음과 같은 문제가 발생했습니다(주어진 것이므로 영향을 줄 수는 없습니다).

모든 파일의 구조는 "이름{공백}접미사.JPG".
따라서 이미지는 동일할 수 있습니다 .이름, 그러나 이 경우에는 해당 항목으로 구별됩니다.접미사. 예:

L083192 (1).JPG  
L083192 (2).JPG  
L083192 (3).JPG  
L083192 (4).JPG

또는

L081473 a.JPG  
L081473 b.JPG

목표는 동일한 이름을 가진 모든 이미지에 카운터(접두사로)를 추가하는 것입니다. 즉

1_L083192 (1).JPG  
1_L083192 (2).JPG  
1_L083192 (3).JPG  
1_L083192 (4).JPG

[..]

16_L081473 a.JPG  
16_L081473 b.JPG

카운터는 어떤 이름이 동일한지 확인하는 "FOR /F" 루프에서 계산되므로 동일한 접두사를 가져야 합니다.
그러나 다음 REN 명령을 적용하여 카운터 접두사를 추가하려고 하면:

ren "%%h*" "!cnt!_%%h*"

문제가 생겼습니다.
( %%h and !cnt! are variables of the "FOR /F" loop)

해당 출력은 다음과 같습니다.

L083192 (1).jpg >> 1_L0831921).jpg        [i.e. " (" gone missing]  
[..]  
L083192 (4).jpg >> 1_L0831924).jpg        [id.]

두 개의 "L081473" 파일은 심지어하나의출력 파일(접미사 없음)!

16_L081473.JPG

의심할 바 없이 dbenham이 그의 책에서 설명한 메커니즘과 연관성이 있습니다.REN(AME) 명령에 대한 광범위한 게시물, 그러나 프로세스에서 일부 중간 문자가 손실되는 대신 원본 파일 이름이 잘릴 것으로 예상하기 때문에 위의 경우에는 문제를 해결할 수 없습니다. REN공백을 수용하기 위해 명령 에서 이러한 파일 이름을 인용했지만 원래 파일 이름의 공백이 이유일 수 있습니다 . 누구든지 설명할 수 있나요?

또한, REN원하는 결과를 생성할 수 없는 것 같거나 생성할 수 있습니까? 일반 배치를 사용하여 원하는 결과를 어떻게 얻을 수 있습니까?

또한 또는 를 REN사용하여 문제를 해결하려고 시도했지만 결과는 동일했습니다. 이 명령은 dbenham이 신중하게 제안한 것과 동일한 구성표를 적용하는 것으로 보입니다.COPYXCOPY같은 게시물에(참고 참조).


배치 파일

FOR /F %%h IN (input.txt) DO (

    IF NOT "%%h" == "prev" (set /A cnt+=1)  

        [some more logic..]

    cd Images
    ren "%%h*" "!cnt!_%%h*"
    cd..

        [some more logic..]

    set prev=%%h
)

메모:나는 파일 이름이 두 번 이상 바뀌는 것을 방지하는 추가 논리 배치를 제거했습니다. "input.txt"에는 접두사를 계산하는 데 충분한 이름만(즉, 접미사 없이) 나타나는 모든 항목이 포함됩니다. 샘플 파일을 제공할 수 있지만 이 메시지에 링크하는 방법을 찾지 못했습니다. 게다가 이름 변경을 복제할 수 없습니다(게다가 "Images" 폴더는 약 480MB입니다).
이 폴더의 전체 파일 이름은 파일 이름 변경을 기다리고 있는 하위 디렉터리 "Images"로 변경하여 고려됩니다. ( REN현재 디렉토리에서만 작동)

답변1

내 RENAME 게시물에서 이 단락의 중요성을 놓치셨거나 인식하지 못하셨습니다.

모든 이름은 문자로 구분된 구성 요소로 나눌 수 있으며, . 각 구성 요소의 끝에만 추가하거나 삭제할 수 있습니다.와일드카드로 나머지 부분을 유지하면서 구성 요소의 시작이나 중간에 문자를 삭제하거나 추가할 수 없습니다.. 대체는 어디에서나 허용됩니다.

와일드카드를 사용하여 기본 이름을 유지하면서 기본 이름의 시작 부분에 문자를 추가하려고 합니다. 위의 진술에 따르면 이것은 수행될 수 없습니다. 각 파일의 이름을 개별적으로 바꿔야 합니다. 이것은 특별히 어렵지 않습니다. 나는 당신의 다른 논리가 정확하다고 가정합니다.

FOR /F %%h IN (input.txt) DO (

    IF NOT "%%h" == "prev" (set /A cnt+=1)  

        [some more logic..]

    cd Images
    for %%F in ("%%h*") do ren "%%F" "!cnt!_%%F"
    cd..

        [some more logic..]

    set prev=%%h
)

지연된 확장이 활성화되어 %%F포함된 경우 코드가 실패합니다 . !이는 좀 더 많은 코드로 해결될 수 있습니다. 지연된 확장을 비활성화한 상태로 시작한 다음 필요에 따라 일시적으로 활성화하는 것이 좋습니다.

setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
  endlocal
  for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)

관련 정보