Windows에서 경로 길이가 260자를 초과하는 파일을 찾으려면 어떻게합니까?


87

XP Windows 스크립트에서 xcopy를 사용하여 디렉토리를 재귀 적으로 복사하고 있습니다. 복사하려는 파일의 경로가 너무 길기 때문에 '메모리 부족'오류가 계속 발생합니다. 경로 길이를 쉽게 줄일 수는 있지만 불행히도 어떤 파일이 경로 길이 제한을 위반하는지 확인할 수 없습니다. 복사 된 파일은 표준 출력 (로그 파일로 리디렉션)에 인쇄되지만 오류 메시지는 터미널에 인쇄되므로 오류가 발생한 디렉터리를 대략적으로 알 수 없습니다. .


답변:


114

a dir /s /b > out.txt를 한 다음 위치 260에 가이드를 추가하십시오.

powershell에서 cmd /c dir /s /b |? {$_.length -gt 260}


1
dir / s / b> out.txt는 작업을 아름답게 수행합니다. 감사. " 'Get-ChildItem'은 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다." powershell이없는 것 같아요.
WestHamster

1
@WestHamster, PowerShell 콘솔에서 해당 명령을 실행해야합니다.
Rami A.

6
다음 Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.과 같은 오류가 발생합니다. 이와 함께 단축 된 경로 만 인쇄됩니다. 예 : D:\Dropbox\ProY...sh._setbinddata. 그것들은 내가 찾고 싶은 경로들과 정확히 일치하지만 전체 경로를 볼 수 없습니다! 이 주위에 어떤 방법이 있습니까?
MiniGod

이것이 작동하도록 할 수없는 유일한 사람입니까? 홈 프리미엄, 파워 쉘 2.0 Win7에 64 비트 사용 - 그때 긴 이름 (240 자)와 가진 테스트 파일을 만들 때, 그것은 또한 긴 이름을 가지고 앉아있는 디렉토리의 이름을 변경하는 것은 Get-ChildItems -r *... 단지 파일을 보는 중지 dir /s /b작품 나를 위해.
Jonas Heidelberg

powershell에서 이것을 달성하는 방법에 대한 내 대답을 참조하여 문제가되는 파일 이름 (260 자 이상)을 찾거나 무시할 수 있습니다.
Jonno

31

이 목적을 위해 경로 길이 검사기 도구 를 만들었습니다 .도구 는 주어진 디렉토리에있는 모든 파일과 디렉토리의 경로 길이를 확인하는 데 사용할 수있는 멋진 무료 GUI 앱입니다.

또한 파일 및 디렉터리 길이를 가져 오는 간단한 PowerShell 스크립트대해 작성하고 블로그에 올렸 습니다. 파일의 길이와 경로를 출력하고 선택적으로 콘솔에도 기록합니다. 특정 길이 (쉽게 수정할 수 있음)를 초과하는 파일 만 표시하는 것이 아니라 길이별로 내림차순으로 표시되므로 임계 값을 초과하는 경로를 확인하는 것은 여전히 ​​매우 쉽습니다. 여기있어:

$pathToScan = "C:\Some Folder"  # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:\temp\PathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.
$writeToConsoleAsWell = $true   # Writing to the console will be much slower.

# Open a new file stream (nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
    $filePath = $_.FullName
    $length = $_.FullNameLength
    $string = "$length : $filePath"

    # Write to the Console.
    if ($writeToConsoleAsWell) { Write-Host $string }

    #Write to the file.
    $stream.WriteLine($string)
}
$stream.Close()

2
흥미로운 스크립트이지만 여전히이 오류가 발생합니다. Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
zkurtz 2014

훌륭한 도구 !! 날짜가 너무 커서 WD MyCloud HDD에 백업을 만들고 싶었습니다. 이 도구를 통해 HDD에 폴더 구조를 생성 할 수있는 최대 길이를 알게되었습니다. 감사.
NJMR

27

가장 간단한 솔루션의 개선으로 Powershell을 설치할 수 없거나 설치할 수없는 경우 다음을 실행하십시오.

dir /s /b | sort /r /+261 > out.txt

또는 (빠름) :

dir /s /b | sort /r /+261 /o out.txt

그리고 260보다 긴 줄은 목록의 맨 위에 올 것입니다. SORT 열 매개 변수 (/ + n)에 1을 추가해야합니다.


개선해 주셔서 감사합니다. Powershell (Windows 2003 상자)을 설치할 수없는 경우였습니다. 투표
preOtep

1을 더 자세히 추가해야하는 이유를 설명해 주시겠습니까?
Xonatron

출력 파일을 줄 길이별로 정렬하는 방법이 있습니까?
Xonatron

@Xonatron, "그리고 260보다 긴 줄"
cliffclof

투표했습니다. 드라이브 ftw 로의 경로를 단축하려면 SUBST도 언급해야한다고 생각합니다.
cliffclof

6

PowerShell을 사용하는 다른 좋은 답변에 대한 대안을 만들었지 만 내 목록도 파일에 저장합니다. 다른 사람이 필요한 경우 여기에서 공유합니다.

경고 : 코드는 현재 작업 디렉토리의 "longfilepath.txt"를 덮어 씁니다. 나는 당신이 이미 가지고있을 것 같지 않다는 것을 압니다. 그러나 만일을 위해!

의도적으로 한 줄로 원했습니다.

Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}

자세한 지침 :

  1. PowerShell 실행
  2. 파일 경로 길이를 확인하려는 디렉토리로 이동합니다 (C : 작동).
  3. 코드 복사 및 붙여 넣기 [PowerShell에 붙여 넣으려면 마우스 오른쪽 버튼을 클릭하거나 Alt + Space> E> P]
  4. 완료 될 때까지 기다린 다음 파일을 봅니다. cat longfilepath.txt | sort

설명:

Out-File longfilepath.txt ;– 'longfilepath.txt'라는 제목의 빈 파일을 작성하거나 덮어 씁니다. 명령을 구분하는 세미콜론.

cmd /c "dir /b /s /a" |– PowerShell에서 dir 명령을 실행 /a하여 숨겨진 파일을 포함한 모든 파일을 표시합니다. |파이프에.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} – 각 행 ($ _로 표시)에 대해 길이가 250보다 크면 해당 행을 파일에 추가하십시오.


2

stderr을 리디렉션 할 수 있습니다.

여기에 자세한 설명이 있지만 다음과 같은 명령이 있습니다.

MyCommand >log.txt 2>errors.txt

찾고있는 데이터를 가져와야합니다.

또한 트릭으로 Windows는 경로에 \\?\( msdn ) 접두사가 붙은 경우 해당 제한을 우회합니다.

긴 경로로 시작하는 루트 또는 대상이있는 경우 또 다른 트릭 SUBST이 도움이 될 것 입니다.

SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
Xcopy Q:\ "d:\Where it needs to go" /s /e
SUBST Q: /D

표준 출력과 오류를 리디렉션하면 큰 파일이 어디에 있는지 충분히 알 수 있습니다. 명령> 파일 2> & 1
WestHamster

작동하지만 내 명령 오류를 별도의 파일로 분리 해야 합니다
SeanC

\\? \도 좋아 보입니다. 그래도 다음 작업을 수행 할 수 없습니다 : xcopy / s \\? \ Q : \ nuthatch \\? \ Q : \ finch
WestHamster

흠 ... \\?\ 명령 줄에서 작동하지 않는 것 같습니다 . 사용하여 다른 아이디어를 추가SUBST
SeanC

불행히도 subst는 명령이 xcopy / sq : \ nuthatch q : \ finch <br/> 유형이고 긴 경로가 nuthatch 아래 알려지지 않은 어딘가에 포함되어 있기 때문에 너무 유용하지 않을 것입니다
WestHamster

2

에서 http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :

Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied

첫 번째 부분은이 폴더와 하위 폴더를 반복합니다. using -ErrorVariable AccessDenied은 문제가되는 항목을 powershell 변수로 푸시하는 것을 의미합니다 AccessDenied.

그런 다음 다음과 같이 변수를 스캔 할 수 있습니다.

$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }

이러한 파일에 대해 신경 쓰지 않는 경우 (경우에 따라 적용 가능할 수 있음) -ErrorVariable AccessDenied부품을 삭제하면 됩니다.


문제는 을 위반 $_.TargetObject하는 파일 의 전체 경로를 포함하지 않고 Directory namesMAX_PATH 만 및 문제가되는 파일 의 상위 디렉토리 이름 을 포함하지 않는다는 것 입니다. 비 Robocopy 또는 Subst 또는 Xcopy 솔루션을 찾는 중이며 작동하는 솔루션을 찾으면 게시 할 예정입니다.
user66001


-2

260보다 큰 경로의 경우 다음
을 사용할 수 있습니다.

Get-ChildItem | Where-Object {$_.FullName.Length -gt 260}

14
자의 예 : 경로 길이를 보려면 다음을 수행하십시오.

Get-ChildItem | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}

14보다 큰 경로 가져 오기 :

Get-ChildItem | Where-Object {$_.FullName.Length -gt 14}  

스크린 샷 :
여기에 이미지 설명 입력

10보다 큰 파일 이름의 경우 :

Get-ChildItem | Where-Object {$_.PSChildName.Length -gt 10}

스크린 샷 :
여기에 이미지 설명 입력


4
당신은 분명히 그 문제에 대해 전혀 모릅니다. 당신이 제안한 어떤 것도 작동하지 않습니다. 읽어
n0rd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.