윈도우에서 경로 길이가 260 자 이상인 파일을 어떻게 찾을 수 있습니까?

StackOverflow https://stackoverflow.com//questions/12697259

문제

나는 재귀 적으로 디렉토리를 복사 할 수 있습니다.나는'메모리 부족'오류가 계속 발생하고 있는데,이는 내가 복사하려는 파일이 너무 긴 경로를 가지고 있기 때문입니다.경로 길이를 쉽게 줄일 수 있지만 불행히도 경로 길이 제한을 위반하는 파일을 찾을 수 없습니다.복사 된 파일은 표준 출력(로그 파일로 리디렉션 됨)에 인쇄되지만 오류 메시지는 터미널에 인쇄되므로 오류가 주어진 디렉토리에 대해 대략적으로 알 수 없습니다.

도움이 되었습니까?

해결책

~을 하다 dir /s /b > out.txt 그런 다음 위치 260에 안내선을 추가하세요.

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

다른 팁

i는 경로 길이 검사기 도구 이 목적을 위해 멋진 무료 GUI 앱입니다.지정된 디렉토리의 모든 파일 및 디렉토리의 경로 길이를 볼 수 있습니다.

또한 "NoreferRer"> 간단한 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()
.

가장 단순한 해결책의 세기로

PowerShell을 설치할 수 없거나 설치하지 않으려면 다음을 실행하십시오.

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

또는 (더 빠른) :

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

와 260보다 긴 줄이 목록 상단에 도달합니다.열 매개 변수 (/ + n)를 정렬하려면 1을 추가해야합니다.

나는 파워 셸을 사용하는 여기에 다른 좋은 답변에 대한 대안을 만들었지 만,내 것은 또한 목록에 파일을 저장합니다.다른 사람이 그런 것을 원할 경우 여기에서 공유 할 것입니다.

경고: 코드는"롱필패스"를 덮어씁니다.현재 작업 디렉토리에 있습니다.나는 당신이 이미 하나를 가질 것 같지는 않다는 것을 알고 있지만,경우에 대비하여!

의도적으로 한 줄에 그것을 원했다:

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

자세한 지침:

  1. 파워셸 실행
  2. 파일 경로 길이를 확인하려는 디렉터리로 이동합니다.:작품)
  3. 코드 복사 및 붙여 넣기[마우스 오른쪽 버튼을 클릭하여 붙여 넣기
  4. 완료 될 때까지 기다린 다음 파일을 봅니다: cat longfilepath.txt | sort

설명:

Out-File longfilepath.txt ; -'긴 파일 경로'라는 제목의 빈 파일을 생성(또는 덮어 쓰기)합니다.-그래세미콜론으로 명령을 분리합니다.

cmd /c "dir /b /s /a" | -파워 쉘에서 디렉터리 명령 실행, /a 숨김 파일을 포함한 모든 파일을 표시합니다. | 파이프에.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} -각 줄($_로 표시)에 대해 길이가 250 보다 큰 경우 해당 줄을 파일에 추가합니다.

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

more 설명 여기 또는 명령이있는 것 :

MyCommand >log.txt 2>errors.txt
.

는 찾고있는 데이터를 잡아야합니다.

또한 트릭으로서 Windows는 경로가 PRANTACODICETAG 코드 ( msdn )

다른 트릭 긴 경로로 시작하는 루트 또는 대상이 있으면 \\?\가 도움이됩니다 :

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

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

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

첫 번째 부분은 이 폴더와 하위 폴더를 반복합니다.사용하여 -ErrorVariable AccessDenied 문제가 되는 항목을 powershell 변수에 밀어넣는 것을 의미합니다. AccessDenied.

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

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

이러한 파일에 관심이 없다면(경우에 따라 적용 가능), 간단히 -ErrorVariable AccessDenied 부분.

tlpd ( "너무 긴 경로 디렉토리")는 나를 저장 한 프로그램입니다. 매우 사용하기 쉽습니다 :

https://sourceforge.net/projects/tlpd/

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

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

예제 14 chars :

경로 길이를 보려면 다음과 같이하십시오.

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}
.

스크린 샷 :

여기에 이미지 설명

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top