मैं विंडोज़ में 260 वर्णों से अधिक पथ लंबाई वाली फ़ाइलें कैसे ढूँढ सकता हूँ?


87

मैं XP x स्क्रिप्ट में xcopy का उपयोग करके किसी निर्देशिका की पुन: प्रतिलिपि बना सकता हूं। मुझे एक 'अपर्याप्त मेमोरी' त्रुटि मिलती रहती है, जो मुझे समझ में आती है क्योंकि मैं जिस फाइल को कॉपी करने की कोशिश कर रहा हूं, उसमें बहुत लंबा रास्ता है। मैं आसानी से पथ की लंबाई कम कर सकता हूं, लेकिन दुर्भाग्य से मैं काम नहीं कर सकता कि कौन सी फाइलें पथ लंबाई प्रतिबंध का उल्लंघन कर रही हैं। कॉपी की गई फ़ाइलें मानक आउटपुट पर मुद्रित होती हैं (जो मैं लॉग फ़ाइल में रीडायरेक्ट कर रहा हूं), लेकिन त्रुटि संदेश टर्मिनल पर मुद्रित होता है, इसलिए मैं लगभग यह भी पता नहीं लगा सकता कि त्रुटि के लिए कौन सी निर्देशिका दी जा रही है। ।


जवाबों:


114

एक करो dir /s /b > out.txtऔर फिर 260 की स्थिति पर एक गाइड जोड़ें

शक्तियों में cmd /c dir /s /b |? {$_.length -gt 260}


1
dir / s / b> out.txt काम को खूबसूरती से करता है। धन्यवाद। "Get-ChildItem 'को आंतरिक या बाहरी कमांड, ऑपरेबल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी जाती है।" मुझे लगता है कि मेरे पास शक्तियां नहीं हैं।
वेस्टपॉइंट

1
@ वेस्टइंडीज, आपको उस कमांड को पॉवरशेल कंसोल में चलाना होगा।
रामी ए।

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। वे बिल्कुल वही रास्ते हैं जिन्हें मैं खोजना चाहता हूं, लेकिन मैं पूरे रास्ते को नहीं देख सकता! इसके आसपास कोई रास्ता?
मिनीगॉड १३'१५ '

क्या मैं अकेला हूँ जो यह काम नहीं कर सकता? Win7 64 बिट होम प्रीमियम, पॉवर्सशेल 2.0 का उपयोग करना - जब मैं एक लंबे नाम (240 वर्ण) के साथ एक परीक्षण फ़ाइल बनाता हूं और फिर उस निर्देशिका का नाम बदल देता हूं जिसमें यह लंबे नाम भी Get-ChildItems -r *रखता है, फ़ाइल को देखना बंद कर देता है ... केवल dir /s /bकाम करता है मेरे लिए।
जोनास हीडलबर्ग

इसे सशक्त रूप से प्राप्त करने के तरीके के लिए मेरा उत्तर देखें, इससे आप या तो आपत्तिजनक फ़ाइल नामों (260 वर्णों से ऊपर) या वैकल्पिक रूप से, उन्हें अनदेखा कर सकते हैं।
जोनो

32

मैंने इस उद्देश्य के लिए पाथ लेंथ चेकर टूल बनाया , जो एक अच्छा, मुफ्त 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

बहुत बढ़िया उपकरण !! मेरे पास बहुत बड़ी तारीख थी, एक WD MyCloud HDD पर एक बैकअप बनाना चाहता था। इस उपकरण से HDD पर एक फ़ोल्डर संरचना बनाने के लिए अधिकतम लंबाई का पता चला। धन्यवाद।
एनजेएमआर

महान उपकरण! मैंने इसका उपयोग 247 वर्णों से अधिक लंबे पथ वाले सभी फ़ाइलों / फ़ोल्डरों को खोजने में सक्षम स्क्रिप्ट बनाने के लिए किया, जो विंडोज में Synology Drive Client के लिए सीमा है। मुख्य कोड है PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248, जबकि echo SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqliteप्रोग्राम फ़ोल्डर साझा करने के लिए आवश्यक था। (यदि आप पूर्ण संहिता में रुचि रखते हैं तो बेझिझक पूछें)
Kar.ma

महान उपकरण, धन्यवाद। 2 Synology NAS के बीच मेरे Rsync-Job के लिए, मुझे सभी FILENAMES लंबे समय तक 143 अक्षरों को जानना चाहिए। यह संपूर्ण पथ लंबाई नहीं है, यह केवल फ़ाइल नाम की अधिकतम लंबाई है। मैं इस तरह के फ़ाइल नाम कैसे पा सकता हूं?
पीटरको

1
अरे @PeterCo आप अभी भी उपरोक्त PowerShell स्क्रिप्ट का उपयोग कर सकते हैं, लेकिन $_.FullNameइसका उपयोग करने के बजाय इसे $_.Nameहर जगह से बदलें ; यह आपको पूर्ण पथ के बजाय फ़ाइल नाम देगा।
डेडलीडॉग

27

सबसे सरल समाधान के शोधन के रूप में, और यदि आप पॉवर्सशेल को स्थापित या नहीं करना चाहते हैं, तो बस चलाएं:

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

या (तेज):

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

और 260 से अधिक लंबी लाइनें लिस्टिंग के शीर्ष पर पहुंचेंगी। ध्यान दें कि आपको SORT कॉलम पैरामीटर (/ + n) में 1 जोड़ना होगा।


शोधन के लिए धन्यवाद। यह मेरा मामला था कि मैं पॉवरशेल (विंडोज 2003 बॉक्स) स्थापित नहीं कर सका।
VOTED

क्या आप बता सकते हैं कि आपको और अधिक विस्तार से 1 क्यों जोड़ना है?
Xonatron

क्या लाइन लंबाई द्वारा आउटपुट फ़ाइल को सॉर्ट करने का कोई तरीका है?
Xonatron

@Xonatron, "और लाइनें 260 से अधिक लंबी"
क्लिफक्लोफ़

मतदान हुआ। मुझे लगता है कि एक ड्राइव ftw में रास्ता छोटा करने के लिए SUBST का भी उल्लेख करना चाहिए।
क्लिफक्लोफ

6

मैंने यहाँ पर अन्य अच्छे उत्तरों का विकल्प बनाया है जो पॉवरशेल का उपयोग करता है, लेकिन मेरा भी सूची को फ़ाइल में सहेजता है। यदि किसी और को कुछ चाहिए तो वह यहाँ साझा करेगा।

चेतावनी: वर्तमान कार्य निर्देशिका में कोड "longfilepath.txt" को अधिलेखित करता है। मुझे पता है कि यह संभावना नहीं है कि आपके पास पहले से ही एक है, लेकिन सिर्फ मामले में!

जानबूझकर यह एक ही पंक्ति में चाहता था:

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

विस्तृत निर्देश:

  1. पॉवरशेल चलाएं
  2. निर्देशिका के लिए आप फ़ाइलपथ लंबाई के लिए जाँच करना चाहते हैं (सी: काम करता है)
  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

उस डेटा को हथियाना चाहिए जिसे आप खोज रहे हैं।

साथ ही, एक ट्रिक के रूप में, विंडोज उस सीमा को दरकिनार कर देता है, यदि पथ के साथ उपसर्ग किया गया है \\?\( 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

एसटीडी आउटपुट को रीडायरेक्ट करना और त्रुटियों को मुझे एक अच्छा संकेत देना चाहिए कि बड़ी फ़ाइल धन्यवाद कहां है। कमांड> फाइल २> & १
वेस्टहोम

वह काम करेगा, लेकिन मेरी कमांड को त्रुटियों को एक अलग फाइल में अलग करना चाहिए
SeanC

\\? भी अच्छा लग रहा है। मुझे हालांकि काम करने के लिए निम्नलिखित नहीं मिल सकता है: xcopy / s \\? \ Q: \ Nuthatch \\? \ Q: \ finch
Westpie

हम्म ... लगता \\?\ है कि कमांड लाइन के लिए काम नहीं करता है। एक और विचार जोड़ा गयाSUBST
SeanC

दुर्भाग्य से विकल्प बहुत उपयोगी नहीं होगा क्योंकि कमांड इस प्रकार की है: xcopy / sq: \ nuthatch q: \ finch <br/> और लंबा रास्ता
न्यूटच के

2

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

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

पहला भाग सिर्फ इसके और उप-फ़ोल्डर्स के माध्यम से पुनरावृत्त करता है; उपयोग करने का -ErrorVariable AccessDeniedमतलब है कि आपत्तिजनक वस्तुओं को पॉवरशेल चर में धक्का दें AccessDenied

तुम तो चर के माध्यम से स्कैन कर सकते हैं जैसे

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

यदि आप इन फ़ाइलों के बारे में परवाह नहीं करते हैं (कुछ मामलों में लागू हो सकते हैं), बस -ErrorVariable AccessDeniedभाग को छोड़ दें ।


समस्या यह है कि उल्लंघन $_.TargetObjectकरने वाली फ़ाइलों के लिए पूर्ण पथ शामिल नहीं है MAX_PATH, केवल निर्देशिका नाम और अपमानजनक फ़ाइलों का मूल निर्देशिका नाम । मैं एक गैर-रोबोकॉपी या पदार्थ या एक्सकोपी समाधान खोजने पर काम कर रहा हूं, और जब मैं काम कर रहा समाधान ढूंढूंगा तो पोस्ट करूंगा।
user66001 19

2

TLPD ("बहुत लंबा पथ निर्देशिका") वह प्रोग्राम है जिसने मुझे बचाया। उपयोग करने के लिए बहुत आसान है:

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


Chrome ने इस डाउनलोड को वायरस युक्त के रूप में चिह्नित किया
Shaun

-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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.