sourcecode

PowerShell에서 파일 이름을 대량으로 변경하려면 어떻게 해야 합니까?

copyscript 2023. 8. 22. 22:25
반응형

PowerShell에서 파일 이름을 대량으로 변경하려면 어떻게 해야 합니까?

다음 작업을 수행하려고 합니다.

Rename-Item c:\misc\*.xml *.tmp

기본적으로 디렉토리 내의 모든 파일의 확장자를 다음으로 변경합니다..tmp대신에.xmlPowerShell에서는 이를 위한 직접적인 방법을 찾을 수 없습니다.

의 도움말 문서에 있는 예 4부터 시작합니다.Rename-Item다음 명령으로 검색:

get-help Rename-Item -examples

예:

Get-ChildItem *.txt| Rename-Item -NewName { $_.Name -replace '\.txt','.log' }

대체 명령에서 대체할 텍스트를 찾기 위해 정규식을 사용하기 때문에 대체 명령의 이스케이프 백슬래시에 대한 도움말 문서의 설명을 참고하십시오.

정규식을 보장하기 위해-replace연산자가 문자열 끝에 있는 확장자만 일치하며, 정규식 문자열 끝 문자를 포함합니다.$.

Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace '\.txt$','.log' }

이것은 @Ohad Schneider가 댓글에 언급한 사건을 처리합니다. 우리는 이름이 붙은 파일을 가지고 있을 수 있습니다.lorem.txt.txt그리고 우리는 끝내길 원합니다.lorem.txt.log보다는lorem.log.log.

정규식이 충분히 엄격하게 대상화되고 @etoxin의 답변에 영감을 받았으므로 다음과 같이 명령을 더 유용하게 사용할 수 있습니다.

Get-ChildItem | Rename-Item -NewName { $_.Name -replace '\.txt$','.log' }

즉, 파이프 이후에 정규식이 충분히 필터링되면 파이프 앞에서 필터링할 필요가 없습니다.또한 명령 문자열을 변경할 필요가 없습니다(예: 위의 명령을 복사하여 '.xml' 파일의 확장자를 변경하는 데 사용하려는 경우).

이것은 원하는 디렉터리에 있을 때도 잘 작동합니다.

Dir | Rename-Item –NewName { $_.name –replace "old","new" }

기존 답변은 다음과 같습니다.-replace연산자, 하지만 파일이 호출되면 어떻게 합니까?a.xml.xml둘 다.xml서브스트링이 교체되고 최종 결과는a.tmp.tmp다행히도, 있습니다.이에 대한 NET 방법:

Dir *.xml | rename-item -newname { [io.path]::ChangeExtension($_.name, ".tmp") } 

(Manish Kumar와 친했습니다.GetFileNameWithoutExtension하지만 이것이 더 우아하고 아마도 조금 더 효율적일 것입니다. 이 경우에 지나치게 중요한 것은 아닙니다.

여기에 작동할 또 다른 변형이 있습니다.

dir *.xml | Rename-Item -NewName {$_.BaseName + ".tmp"}

$_.BaseName(마지막) 확장자 없이 "기본" 이름을 수행합니다.

별칭을 사용하는 단축 버전은 다음과 같습니다.

ls *.xml | ren -new {$_.BaseName + ".tmp"}
dir -Recurse | where-object -FilterScript {$_.Extension -eq ".xml"} | Rename-Item -NewName {[System.IO.Path]::GetFileNameWithoutExtension($_.fullname) + ".tmp"}

-WhatIf를 사용하여 먼저 결과를 평가합니다.

훨씬 더 쉽습니다. 검색 문자열 바꾸기는 정규식입니다.

dir *.xml | rename-item -newname {$_.name -replace "xml$","tmp"}

"$"는 문자열 끝을 나타내므로 "xml" 문자는 파일 이름의 마지막 세 문자여야 합니다.

이것은 효과가 있는 것처럼 보이며 단순한 것이 복잡한 것보다 낫습니다. (https://www.python.org/dev/peps/pep-0020/) 방법 (일단 디렉토리에 들어가면):

$files = Get-ChildItem -file -Filter *.xml;
  ForEach ($file in $files)
  {
  $n = $file.Basename
  Copy-Item -Path $file -Destination "$n.tmp"
  Remove-Item "$n.xml"
  }

언급URL : https://stackoverflow.com/questions/13382638/how-can-i-bulk-rename-files-in-powershell

반응형