배치 스크립트를 사용하여 재귀 적으로 파일, 폴더 및 하위 폴더 이름 바꾸기


1
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=V1
SET new=newdocV2
for /f "tokens=*" %%f in ('dir /b *.ods') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

위의 코드는 파일이나 폴더의 이름 만 바꾸기 위해 작동합니다.

파일과 폴더의 이름을 재귀 적으로 바꾸려면 코드가 필요합니다.


슈퍼 유저에 오신 것을 환영합니다! 너를 편집 해 주실 수 있겠습니까? 의문 이 문제를 해결하기 위해 스스로 시도한 것을 알려주십시오.
Twisty Impersonator


@JosefZ - 재귀 적 이름 바꾸기가 그렇게 간단하지 않습니다. 만나다 내 대답
dbenham

find . -iname "*.ods" -print0 | xargs -0 rename "s/V1/newdocV2/g" - 이것은 Gnu / Linux 또는 Microsoft의 Powershell에서 작동합니다 (Posix와 호환되지만 보지 못했습니다.)
ctrl-alt-delor

답변:


1

게시 한 코드가 파일과 폴더의 이름을 바꿉니다. 그러나 재귀 적으로 폴더 내의 파일 및 폴더의 이름을 바꿉니다.

DIR 마스크에 확장명이 있고 폴더 이름에 일반적으로 확장명이 없으므로 폴더가 아닌 파일의 이름을 바꿀뿐입니다. 이 경우 DIR을 추가하기 만하면됩니다. /S 옵션을 사용하여 하위 폴더로 /A-D 폴더 제외 옵션 newname은 경로 이름을 무시하고 파일 이름만으로 설정해야합니다. %%nxF. 그리고 MOVE 명령은 목적지 경로가 필요합니다. %%dpF. 이것은 일반적으로 효과가있는 해결책을 제공 할 것이지만, 합병증이있을 수 있습니다 (자세한 내용은 나중에 설명합니다).

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s /a-d *.ods') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

하나의 패스에서 파일과 폴더의 이름을 모두 바꾸려면 분명히
/A-D 선택권. 그러나 DIR 명령의 결과를 정렬하여 자식이 부모보다 먼저 처리되도록해야합니다. 그렇지 않으면 나열된 경로가 더 이상 유효하지 않기 때문에 자식 이름이 변경되지 않습니다.

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

이제 잘못 될 수있는 문제와 해결 방법 및 기타 개선 사항이 있습니다.

1) 파일 또는 폴더 이름에 ! 문자 (희귀하지만 가능). 지연 확장이 사용되는 동안 FOR 변수를 확장하면 포함 된 값이 손상됩니다 !. 해결 방법은 지연된 확장을 루프 내에서 켜고 끄는 것입니다.

2) 파일 A의 새 이름은 파일 B의 기존 이름과 일치 할 수 있으며 MOVE 명령은 B를 A로 겹쳐 쓰게됩니다. 최종 결과는 두 개가 있기 전의 하나의 파일입니다. 이것은 아마도 나쁜 것입니다. 해결 방법은 MOVE 대신 REN 명령을 사용하는 것입니다. 이 경우 이름 바꾸기가 실패하고 좋은 일이라고 생각합니다. REN 명령에 새 이름이 필요합니다. 없이 목적지 패스.

3) 아마도 파일 / 폴더의 이름이 바뀐 방법 목록을 원할 것입니다. 오류가 발생하면 특히 이름 변경에 실패한 것을 정확히 볼 수 있습니다. 간단한 해결책은 명령을 실행하기 전에 명령을 ECHO하는 것입니다.

4) 새 이름이 이전 이름과 일치하면 이름 바꾸기 동작을 수행 할 필요가 없습니다. 이것은 IF 조건을 추가하여 수행됩니다.

@echo off
setlocal disableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)

여전히 잠재적 인 문제가 있습니다. 예를 들어, 배치에는 = 변수 값 내의 문자. 이 문제는 순수한 배치로 해결하기가 어렵습니다.

당신이 단순히 내 인생을 사용하면 인생은 훨씬 간단 해집니다. JREN.BAT 유틸리티 - 정규 표현식을 사용하여 파일이나 폴더의 이름을 바꾸는 하이브리드 JScript / 배치 스크립트. JREN.BAT는 XP 이후의 모든 Windows 시스템에서 기본적으로 실행되는 순수한 스크립트입니다. 를 통해 전체 문서를 볼 수 있습니다. JREN /?. 당신은
JREN /?|MORE,하지만 내 콘솔 창을 이전 줄을 볼 수 있도록 스크롤 할 수 있도록 큰 버퍼로 구성되어 있으므로 더 이상 필요하지 않습니다.

이 도구를 사용하려면 정규 표현식을 이해해야합니다. 이 경우에는 문제가되지 않지만 검색어에 정규 표현식 메타 문자가 포함 된 경우 올바른 문자 해석을 얻으려면 이스케이프 처리해야합니다. 그러나 정규 표현식의 힘은 놀라운 것입니다. 변경 사항이 무엇인지 정확하게 설명 할 수 있습니다.

나는 /I 옵션을 사용하여 대 / 소문자 구분없이 검색 할 수 있습니다.

JREN.BAT는 파일의 이름 만 바꿉니다. 또는 두 파일의 이름을 바꾸려면 두 개의 명령이 필요합니다.

jren "V1" "newdocV2" /i /s /fm "*.ods"
jren "V1" "newdocV2" /i /s /fm "*.ods" /d

JREN은 일괄 처리 스크립트이므로, CALL JREN 위의 명령을 다른 배치 스크립트에 넣으면됩니다.


0

여기에 내 코드가 성공적으로 폴더 및 파일의 이름을 바꿀 성공적으로 일하고 있습니다. 나는 파일 내부의 내용을 바꾸고 싶습니다.

다음은 폴더와 파일의 이름을 바꿀 때 사용하는 배치 파일 스크립트입니다.

@echo off
setlocal disableDelayedExpansion
set "old=V21"
set "new=V22"
for /f "delims=" %%F in ('dir /b /s *. *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)  

아래 코드를 사용하여 폴더 및 파일의 이름을 V31에서 V32로 변경했지만 아래 코드로 V31에서 V32로 xml 파일을 변경할 수 없습니다.
user420936

0

아래 코드를 사용하여 폴더 및 파일의 이름을 V31에서 V32로 변경했지만 아래 코드로 V31에서 V32로 xml 파일을 변경할 수 없습니다.

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)  

안녕하세요. user420936,이 질문에 대한 세 번째 답변은 질문에 대한 답변의 범위와 새로운 질문이 어떤 부분인지 분명하지 않습니다. 이 질문에 대답하기 위해 하나의 대답을 사용하고 (원한다면), 다른 것을 제거하고 XML 부분에 대한 자신 만의 질문을 만드십시오.
bummi

당신은 편집하다 링크를 클릭하십시오. 가져 가세요. 순회 공연 방문하여 지원 센터 우리가 일반 포럼과 다른 점을 이해합니다.
rene

0

아래 코드를 사용하면 폴더와 파일의 이름을 V31에서 V32로 바꿀 수 있지만 아래 코드로 XML 파일을 V31에서 V32로 변경할 수 없습니다.

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

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