উইন্ডোতে 260 টি অক্ষরের চেয়েও বেশি দৈর্ঘ্যের ফাইলগুলি কীভাবে খুঁজে পাব?


87

পুনরুক্তি করে একটি ডিরেক্টরি অনুলিপি করতে আমি এক্সপি উইন্ডোজ স্ক্রিপ্টে একটি এক্সকপি ব্যবহার করছি। আমি একটি 'অপর্যাপ্ত মেমরি' ত্রুটি পেয়ে যাচ্ছি যা আমি বুঝতে পেরেছি কারণ যে ফাইলটি আমি অনুলিপি করার চেষ্টা করছি তার দীর্ঘ পথ রয়েছে। আমি সহজেই পাথের দৈর্ঘ্য হ্রাস করতে পারি, তবে দুর্ভাগ্যক্রমে আমি কোন ফাইলগুলি পথের দৈর্ঘ্যের সীমাবদ্ধতা লঙ্ঘন করছে তা কার্যকর করতে পারছি না। অনুলিপি করা ফাইলগুলি স্ট্যান্ডার্ড আউটপুটে মুদ্রিত হয় (যা আমি কোনও লগ ফাইলে পুনর্নির্দেশ করছি), তবে ত্রুটি বার্তাটি টার্মিনালে মুদ্রিত হয়, তাই ত্রুটিটি কোন ডিরেক্টরিতে দেওয়া হচ্ছে তা প্রায় আমিও কাজ করতে পারি না I ।


উত্তর:


114

একটি করুন dir /s /b > out.txtএবং তারপরে 260 অবস্থানে একটি গাইড যুক্ত করুন

পাওয়ারশেল ইন cmd /c dir /s /b |? {$_.length -gt 260}


4
dir </s> আউট.টিএসটি সুন্দর করে কাজটি করে। ধন্যবাদ "'গেট-চাইল্ড আইটেম' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।" আমার ধারণা আমার পাওয়ারশেল নেই।
ওয়েস্টহ্যামস্টার

4
@ ওয়েস্টহ্যামস্টার, আপনাকে পাওয়ারশেল কনসোলে সেই কমান্ডটি চালাতে হবে।
রামি এ।

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। সেগুলি হ'ল আমি যে পথগুলি খুঁজতে চাইছি তা কিন্তু আমি পুরো পথটি দেখতে পাচ্ছি না! কোন উপায় এই কাছাকাছি?
মিনিগোড

আমি কি একমাত্র এই কাজটি করতে পারি না? উইন 64৪ বিট হোম প্রিমিয়াম, পাওয়ারশেল ২.০ ব্যবহার করে - যখন আমি একটি দীর্ঘ নাম (২৪০ টি অক্ষর) দিয়ে একটি পরীক্ষা ফাইল তৈরি করি এবং তারপরে যে ডিরেক্টরিতে এটি দীর্ঘ নাম রাখে তার নাম পরিবর্তন করে, Get-ChildItems -r *ফাইলটি দেখা বন্ধ করে দেয় ... কেবলমাত্র dir /s /bকাজ করে আমার জন্য.
জোনাস হাইডেলবার্গ

পাওয়ারহেলটিতে এটি অর্জনের জন্য আমার উত্তর দেখুন, আপনাকে আপত্তিজনক ফাইলের নামগুলি (260 অক্ষরের উপরে যারা) সন্ধান করতে বা বিকল্পভাবে, সেগুলি উপেক্ষা করার অনুমতি দিন।
জোনো

32

আমি এই উদ্দেশ্যে পাথ দৈর্ঘ্য পরীক্ষক সরঞ্জামটি তৈরি করেছি , এটি একটি দুর্দান্ত, ফ্রি জিইউআই অ্যাপ্লিকেশন যা আপনি কোনও প্রদত্ত ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরিগুলির পাথ দৈর্ঘ্য দেখতে ব্যবহার করতে পারেন।

আমি ফাইল এবং ডিরেক্টরি দৈর্ঘ্য পাওয়ার জন্য একটি সাধারণ পাওয়ারশেল স্ক্রিপ্ট সম্পর্কে লিখেছি এবং ব্লগ করেছি । এটি কোনও ফাইলের দৈর্ঘ্য এবং পথকে আউটপুট দেবে এবং allyচ্ছিকভাবে এটি কনসোলেও লিখবে। এটি কেবলমাত্র নির্দিষ্ট দৈর্ঘ্যের (সহজে তৈরি করার একটি সহজ পরিবর্তন) ফাইল প্রদর্শন করার সীমাবদ্ধ নয়, তবে দৈর্ঘ্যে এগুলি অবতরণ প্রদর্শন করে, তাই আপনার চৌকাঠের উপরে কোন পাথ রয়েছে তা এখনও দেখতে খুব সহজ। এটা এখানে:

$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()

4
আকর্ষণীয় স্ক্রিপ্ট, তবে আমি এখনও এই ত্রুটিটি 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.
পেয়েছি

দুর্দান্ত সরঞ্জাম !! আমার বিশাল তারিখ ছিল, ডাব্লুডি মাইক্লাউড এইচডিডি তে একটি ব্যাকআপ তৈরি করতে চেয়েছিল। এই সরঞ্জামের মাধ্যমে এইচডিডি তে একটি ফোল্ডার কাঠামো তৈরি করার সর্বোচ্চ দৈর্ঘ্য জানতে পেরেছিল। ধন্যবাদ
এনজেএমআর

দুর্দান্ত সরঞ্জাম! আমি এটি ব্যবহার করে একটি স্ক্রিপ্ট তৈরি করতে সক্ষম হয়েছি যাতে 247 টি অক্ষরের চেয়ে বেশি সময় ধরে থাকা সমস্ত ফাইল / ফোল্ডার খুঁজে পেতে সক্ষম হয় যা উইন্ডোজের সিনোলজি ড্রাইভ ক্লায়েন্টের সীমা। প্রধান কোড PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248, যখন echo SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqliteপ্রোগ্রামেটিক্যালি ভাগ ফোল্ডার পেতে প্রয়োজন পড়তো। (আপনি যদি পুরো
কোডটিতে

দুর্দান্ত সরঞ্জাম, আপনাকে ধন্যবাদ। আমার 2 সাইনোলজি নাসের মধ্যে রাইকিঙ্ক-জবের জন্য, আমার সমস্ত FILENAMES এর পরে 143 টি অক্ষর জানা উচিত। এটি পুরো পাথ দৈর্ঘ্য নয়, এটি ফাইলের নাম অনুসারে কেবল সর্বোচ্চ দৈর্ঘ্য। আমি কীভাবে এই জাতীয় ফাইলগুলি খুঁজে পেতে পারি?
পিটারকো

4
আরে @ পিটারকো আপনি এখনও উপরের পাওয়ারশেল স্ক্রিপ্টটি ব্যবহার করতে পারেন, তবে $_.FullNameকেবল এটি $_.Nameসর্বত্র ব্যবহার করে প্রতিস্থাপন করুন ; এটি আপনাকে পুরো পথের পরিবর্তে ফাইলের নাম দেবে।
মারাত্মক ডগ

27

সহজ সমাধানের সংশোধন হিসাবে এবং আপনি পাওয়ারশেল ইনস্টল করতে না পারলে বা না করতে চাইলে কেবল চালনা করুন:

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

বা (দ্রুত):

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

এবং 260 এর চেয়ে দীর্ঘ লাইনগুলি তালিকার শীর্ষে উঠবে। নোট করুন যে আপনাকে অবশ্যই SORT কলাম প্যারামিটারে (/ + এন) যোগ করতে হবে।


পরিমার্জন জন্য ধন্যবাদ। এটি আমার ক্ষেত্রে ছিল যে আমি পাওয়ারশেল (উইন্ডোজ 2003 বাক্স) ইনস্টল করতে পারিনি। ভোট দিয়েছেন
preOtep

আপনাকে আরও 1 টি যুক্ত করতে হবে কেন তা ব্যাখ্যা করতে পারেন?
Xonatron

লাইন দৈর্ঘ্য দ্বারা আউটপুট ফাইল বাছাই করার কোন উপায় আছে?
জোনাট্রন

@ জোনাট্রন, "এবং লাইনগুলি 260 এর চেয়ে দীর্ঘ"
ক্লিফক্লফ

ভোট দিয়েছেন। আমি মনে করি এটিতে একটি ড্রাইভ এফটিডব্লুতে একটি পথ ছোট করার জন্য 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. কোডটি অনুলিপি করুন এবং আটকান [পাওয়ারশেলে পেস্ট করতে ডান ক্লিক করুন, বা Alt + স্পেস> ই> পি]
  4. এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন এবং তারপরে ফাইলটি দেখুন: cat longfilepath.txt | sort

ব্যাখ্যা:

Out-File longfilepath.txt ;- 'লংফিলিপথ.txt' শিরোনাম একটি ফাঁকা ফাইল তৈরি করুন (বা ওভাররাইট)। পৃথক কমান্ড আধা-কোলন।

cmd /c "dir /b /s /a" |- /aলুকানো ফাইল সহ সমস্ত ফাইল দেখানোর জন্য , পাওয়ারশেলে ডিয়ার কমান্ড চালান । |পাইপ যাও।

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} - প্রতিটি লাইনের জন্য ($ _ হিসাবে চিহ্নিত), দৈর্ঘ্য যদি 250 এর বেশি হয় তবে ফাইলটি সেই লাইনটি যুক্ত করুন।


2

আপনি stderr পুনর্নির্দেশ করতে পারেন।

আরো ব্যাখ্যা এখানে কিন্তু মত কমান্ড থাকার:

MyCommand >log.txt 2>errors.txt

আপনি যে ডেটা খুঁজছেন তা দখল করা উচিত।

এছাড়াও, কৌতুক হিসাবে, উইন্ডোজ সেই পথটিকে \\?\( এমএসডিএন ) পূর্বনির্ধারিত করা থাকলে সেই সীমাবদ্ধতাটিকে বাইপাস করে

আপনার যদি একটি মূল বা গন্তব্য থাকে যা দীর্ঘ পথ দিয়ে শুরু হয় তবে আর একটি কৌশল সম্ভবত 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
ওয়েস্টহ্যামস্টার

এটি কাজ করবে, তবে আমার কমান্ডের ত্রুটিগুলি একটি পৃথক ফাইলে আলাদা করা উচিত
SeanC

\\? too দেখতেও ভালো লাগছে। যদিও আমি নিম্নলিখিতগুলি কাজ করতে পারি না: xcopy / s \\? \ প্রশ্ন: \ ন্যাচ্যাচ \\? \ প্রশ্ন: \ ফিঞ্চ
ওয়েস্টহ্যামস্টার

হুম ... মনে \\?\ হয় কমান্ড লাইনের জন্য কাজ করে না। ব্যবহার করে আরও একটি ধারণা যুক্ত করা হয়েছেSUBST
সানসি

দুর্ভাগ্যক্রমে সাবটি খুব কার্যকর হবে না কারণ কমান্ডটি প্রকারের: xcopy / sq: \ nuthatch q: \ Finch <br/> এবং দীর্ঘ পথটি
নিউচ্যাচ এর

2

Http://www.powershellmagazine.com/2012/07/24/jaap-brasser- loversite- 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, কেবল ডিরেক্টরি নাম এবং আপত্তিজনক ফাইলগুলির পিতামহুল ডিরেক্টরি নাম । আমি একটি নন-রোবকপি বা সাবস্ট বা এক্সকপি সমাধান সন্ধানের জন্য কাজ করছি এবং আমি যখন কোনও কার্যকরী সমাধান খুঁজে পাব তখন পোস্ট করব।
ব্যবহারকারী 66001

2

টিএলপিডি ("খুব দীর্ঘ পথ ডিরেক্টরি") হ'ল এমন একটি প্রোগ্রাম যা আমাকে বাঁচিয়েছিল। ব্যবহার করা খুব সহজ:

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


ক্রোম এই ডাউনলোডটিকে একটি ভাইরাসযুক্ত বলে পতাকাঙ্কিত করেছে
শান

-2

260 এর চেয়ে বেশি পাথের জন্য:
আপনি এটি ব্যবহার করতে পারেন:

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

14 টি অক্ষরের উদাহরণ:
পথগুলির দৈর্ঘ্য দেখতে:

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

১৪ এর চেয়েও বেশি পাথ পান:

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.