programing

Powershell에서 파일 이름을 소문자로 변경

sourcetip 2023. 8. 20. 18:19
반응형

Powershell에서 파일 이름을 소문자로 변경

저는 Powershell 2.0을 사용하여 파일 묶음의 이름을 재귀적으로 바꾸려고 합니다.디렉토리 구조는 다음과 같습니다.

Leaflets
+ HTML
  - File1
  - File2
  ...
+ HTMLICONS
  + IMAGES
    - Image1
    - Image2
  - File1
  - File2
  ...
+ RTF
  - File1
  - File2
  ...
+ SGML
  - File1
  - File2
  ...

다음 명령을 사용합니다.

get-childitem Leaflets -recurse | rename -newname { $_.name.ToLower() }

파일 이름을 바꾸는 것처럼 보이지만 하위 디렉터리에 대해 불평합니다.

Rename-Item : Source and destination path must be different.

로보카피를 사용하여 매달 데이터를 다시 로드하지만 디렉토리는 변경되지 않으므로 수동으로 이름을 바꿀 수 있습니다.당신을 위해 뭔가를 할 방법이 있나요?get-children하위 디렉터리를 건너뛰다(예:find Leaflets -type f ...)?

감사해요.

업데이트: 이미 소문자인 파일에 문제가 있는 것 같습니다.명령을 다음으로 변경하려고 했습니다.

get-childitem Leaflets -recurse | if ($_.name -ne $_name.ToLower()) rename -newname { $_.name.ToLower() }

하지만 지금 파워셸은 불평합니다.ifcmdlet, 함수 등이 아닙니다.의 출력을 파이프로 연결할 수 있습니까?get-childitem완전히if진술서?

업데이트 2: 작동합니다.

$files=get-childitem Leaflets -recurse
foreach ($file in $files)
{
    if ($file.name -ne $file.name.ToLower())
    {
        rename -newname { $_.name.ToLower() }
    }
}

이미 자신의 답변을 게시했지만 다음과 같은 변형이 있습니다.

dir Leaflets -r | % { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }

몇 가지 요점:

  • dirGet-ChildItem의 별칭입니다(및 -r은 -Recurse의 줄임말).
  • ForEach-Object의 별칭입니다.
  • -cne은 대소문자를 구분하는 비교입니다.-ne은 대소문자 차이를 무시합니다.
  • $_는 ForEach-Object 루프에서 현재 항목을 참조하는 방법입니다.
  • renRename-Item의 별칭입니다.
  • FullName을(를) 사용하면 올바른 파일을 터치할 수 있기 때문에 선호할 수 있습니다.

디렉터리의 이름을 변경하지 않으려면 다음과 같은 항목을 포함할 수 있습니다.

if ((! $_.IsPsContainer) -and $_.Name -cne $_.Name.ToLower()) { ... }

PowerShell을 계속 배우고 탐색하는 데 도움이 되었으면 합니다.

Rename-Item에 직접 파이프를 연결하고 Scriptblock을 -와 함께 사용할 수 있습니다.NewName매개 변수(파이프라인 입력도 허용하므로)를 사용하여 이 작업을 단순화할 수 있습니다.

Get-ChildItem -r | Where {!$_.PSIsContainer} | 
                   Rename-Item -NewName {$_.FullName.ToLower()}

별칭 포함:

gci -r | ?{!$_.PSIsContainer} | rni -New {$_.FullName.ToLower()}

방법의 특성상 앞의 답변에 많은 문제가 있습니다.Rename-ItemPiping, Looping 및 Windows 파일 시스템이 작동합니다.안타깝게도 주어진 폴더 내의 모든 파일과 폴더의 이름을 소문자로 바꾸는 가장 간단한 솔루션은 다음과 같습니다.

Get-ChildItem -Path "/Path/To/You/Folder" -Recurse | Where{ $_.Name -cne $_.Name.ToLower() } | ForEach-Object { $tn="$($_.Name)-temp"; $tfn="$($_.FullName)-temp"; $nn=$_.Name.ToLower(); Rename-Item -Path $_.FullName -NewName $tn; Rename-Item -Path $tfn -NewName $nn -Force; Write-Host "New Name: $($nn)";}

이것을 약간 수정하십시오. 특정 유형의 파일 이름만 업데이트하려면 다음을 시도하십시오.

get-childitem *.jpg | foreach { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }

이것은 폴더 내의 jpg 파일만 소문자로 만들고 나머지는 무시합니다.

임시로 이름을 다른 이름으로 바꾼 다음 모든 소문자의 이름을 다시 지정해야 합니다.

$items = get-childitem -Directory -Recurse

foreach ($item in $items)
{

   if ($item.name -eq $item.name.ToLower())
   {    

       $temp = $item.FullName.ToLower() + "_"
       $name = $item.FullName.ToLower()
       ren $name $temp

       ren $temp $name
   }

에서는 PowerShell을 이 더 whereif파이프라인에서:

gci - 재활용 전단 |? { $_.name - ne $.Name.ToLower() } |{ren-NewName$.Name.ToLower() }(으)로 이동

Jay Bazuzi의 답변에 대한 작지만 중요한 수정.-cnewhere-part가 반환해야 하는 경우 (대소문자 구분이 같지 않음) 연산자를 사용해야 합니다.

또한 Path 매개 변수가 있어야 한다는 것을 알게 되었습니다.이 버전은 내 설정에서 작동했습니다.

gci -Recurse | 
    ? { $_.Name -cne $_.Name.ToLower() } | 
    % { ren $_.Name -NewName $_.Name.Tolower()  }

이 스레드를 따르는 모든 사용자를 위해 다음 행을 사용하여 파일과 디렉터리를 모두 낮출 수도 있습니다.

Get-ChildItem -r  | Rename-Item -NewName { $_.Name.ToLower().Insert(0,'_') } -PassThru |  Rename-Item -NewName { $_.Name.Substring(1) }

주요 게시물: https://stackoverflow.com/a/70559621/4165074

이름 또는 지원되지 않는 다른 문자의 [] 괄호와 함께 작동하도록 수정되었으며 디렉토리도 처리합니다(또는 생략할 수 있습니다).저는 이것을 여러 곳에서 조립했습니다.

파일에 저장한 다음 대상 dir로 이동하여 실행할 수 있어야 합니다.

#Get the directories / sub directories and rename to lowercase 
Get-ChildItem -recurse| ?{ $_.PSIsContainer -And $_.Name -CMatch "[A-Z]" } | %{ 
$NName = $_.Name.ToLower() 
#Set temporary name to enable rename to the same name; Windows is not case sensitive 
$TempItem = Rename-Item -LiteralPath $_.FullName -NewName "x$NName" -PassThru Rename-Item -LiteralPath $TempItem.FullName -NewName $NName }

#Now handle all the files
Get-ChildItem -LiteralPath . -Recurse | Where{ $_.Name -cne $_.Name.ToLower() } | ForEach-Object { 
$tn="$($_.Name)-temp"; $tfn="$($_.FullName)-temp"; 
$nn=$_.Name.ToLower(); 
Rename-Item -LiteralPath $_.FullName -NewName $tn; 
Rename-Item -LiteralPath $tfn -NewName $nn -Force; 
Write-Host "New Name: $($nn)";
}

언급URL : https://stackoverflow.com/questions/3822745/rename-files-to-lowercase-in-powershell

반응형