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() }
하지만 지금 파워셸은 불평합니다.if
cmdlet, 함수 등이 아닙니다.의 출력을 파이프로 연결할 수 있습니까?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() } }
몇 가지 요점:
- dir는 Get-ChildItem의 별칭입니다(및 -r은 -Recurse의 줄임말).
- ForEach-Object의 별칭입니다.
- -cne은 대소문자를 구분하는 비교입니다.-ne은 대소문자 차이를 무시합니다.
- $_는 ForEach-Object 루프에서 현재 항목을 참조하는 방법입니다.
- ren은 Rename-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-Item
Piping, 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을 이 더 where
에 if
파이프라인에서:
gci - 재활용 전단 |? { $_.name - ne $.Name.ToLower() } |{ren-NewName$.Name.ToLower() }(으)로 이동
Jay Bazuzi의 답변에 대한 작지만 중요한 수정.-cne
where-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
'programing' 카테고리의 다른 글
NuGet: Install.ps1 파일로 파일의 속성을 변경하려면 어떻게 해야 합니까? (0) | 2023.08.20 |
---|---|
로컬 호스트 웹 사이트가 mariadb의 링크를 통해 액세스하고 표시할 수 있는 pdfs 디렉토리를 만드는 방법은 무엇입니까? (0) | 2023.08.20 |
가져오기: 가져오기 응답을 사용하여 변수를 설정하고 함수에서 반환합니다. (0) | 2023.08.20 |
SQL Server Management Studio를 사용하여 BLOB를 데이터베이스에 삽입하는 방법 (0) | 2023.08.20 |
jooq jsonArrayAgg 쿼리 mariadb/mysql은 항상 "SQL 구문의 오류" 예외를 받습니다. (0) | 2023.08.20 |