かなり深くネストされているフォルダーを削除し、「ファイル名が長すぎる」ことを避けるにはどうすればよいですか?


70

Eclipseは、非常に深くネストされたディレクトリの1つに一時フォルダを作成しました。たとえば、

dir1\dir1\dir1\dir1\...

Windowsのエクスプローラー、delまたはrmdirコマンド、またはCygwinの「rm」コマンドを使用して、このフォルダーを削除できません。この非常に長いフォルダーを削除するにはどうすればよいですか?

「ファイル名が長すぎます...」と言い続けるだけです。


回答:


105

あなたが私のような人で、このような問題を修正するために追加のソフトウェアをインストールしたくない場合は、XQYZの提案robocopy問題解決に使用します。(私の場合、最初にロボコピーによって問題が作成されました。ロボコピーに/ XJを指定せずに、再帰的なジャンクションポイントを持つディレクトリをコピーすることによって)。

c:\ subdir \ more \ offending_dirから始まるディレクトリツリーを削除するには:

ステップごとのプロセス全体は、次のように簡単です。

  1. cd c:\subdir\more 親ディレクトリにcdします。
  2. mkdir empty 空のディレクトリを作成します。
  3. robocopy empty offending_dir /mir 空のディレクトリを問題のあるディレクトリにミラーリングします。
  4. しばらく待って完了です!以下で仕上げます:
  5. rmdir offending_dir 現在空になっている問題のディレクトリを削除し、
  6. rmdir empty 中間の空のディレクトリを削除します。

2
素晴らしい提案。私の問題もロボコピーによって作成され、あなたが説明したようにロボコピーの修正は私のために働いた。
ネイサンガラベディアン

3
またrobocopy、ジャンクションポイントを台無しにしました。混乱を一掃する方法を教えてくれてありがとう!
Mr.Wizard

私のフォルダはrobocopyをで作成されたが、それは完全にそれらを削除されませんでした
サーシャ

11
Node Package Manager(NPM)がこの問題を引き起こしました。何らかの理由でネストされたパッケージが非常に多くありました。
デビッドシャーレット14

これは明らかにオーダーメイドの再帰的なバッチスクリプトよりもはるかに優れた最良かつ最も合理的な答えです
修道-パニック

39

これは実際には修正が非常に簡単です。ディレクトリ構造は次のようになっているとしましょう。

C:\Dir1\Dir1\Dir1\Dir1…

修正するには、各フォルダーの名前を1文字のフォルダー名に変更して、削除するのに長すぎないようにします。

  1. に名前C:\Dir1を変更C:\D
  2. 案内する C:\D\
  3. に名前C:\D\Dir1を変更C:\D\D
  4. 案内する C:\D\D\
  5. パスの合計長が<260になるまで1に移動します

プロセスを自動化するバッチファイルを次に示します(この単純なバージョンは、質問で説明されているような単純なディレクトリ、特に使い捨てのディレクトリに最適です)。可能な限り最上位のフォルダーに渡します(C:\Dir1for C:\Dir1\Dir1\Dir1…またはC:\Users\Bob\Desktop\New Folderfor C:\Users\Bob\Desktop\New Folder\abcdefghi…

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

技術説明

他の提案された解決策は後方です。最も内側のディレクトリから外側に向かって作業して修正することはできません。別の方向に進む必要があります。

ディレクトリにアクセスしようとすると、明示的かどうかに関係なく、絶対パスを使用してアクセスします。これには、その前にあるすべてのものが含まれます。したがって、のようなディレクトリ構造の場合C:\Dir1\Dir1\Dir1\Dir1、最も内側のパスの長さDir1は22です。ただし、最も外側のパスの長さはDir17だけであるため、その内容に関係なくアクセスできます(特定のディレクトリのパスのコンテキストで) 、ファイルシステムには、その内容や子ディレクトリの合計パス長に対する影響についての知識はありません。祖先ディレクトリのみです。合計パス長が長すぎる場合、ディレクトリの名前を変更することはできません。

したがって、パスが長すぎる場合は、可能な限り最高レベルに移動し、名前を1文字の名前に変更して、そのレベルごとに繰り返す必要があります。そのたびに、古い名前と新しい名前の違いによって、パスの全長が短くなります。

反対も同様です。サポートされている最大長(DOSおよびWindows MAX_PATH = 260)を超えるパスを作成することはできません。ただし、ディレクトリの名前を変更して、最も内側から外側に長い名前に変更できます。その結果、絶対パスが> 260であるより深いフォルダーにはアクセスできなくなります。(それは、それらを「隠し」または安全にするものではありません。それらは簡単にアクセスできるため、このメソッドを使用してファイルを非表示にしないでください。)


興味深いサイドノート

Windows 7 Explorerでフォルダーを作成すると、Explorerでサブディレクトリを作成して、合計長がを超えるように見える場合がありますMAX_PATHが、実際には「DOS 8.3ファイル名」を使用して不正をしています。これを確認するには、次のようなツリーを作成します。

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

696文字の長さで、もちろん260文字よりはるかに長いです。さらに、エクスプローラーで最も内側のサブディレクトリに移動すると、フォーカスが合っていないときにアドレスバーに期待どおりに表示されますが、アドレスをクリックするとbar、パスをに変更しますC:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\。長さはわずか102文字です。

XPでは、これを行いません。代わりに、サポートされているよりも長いパスを作成することを断固として拒否します。

本当に興味深いのは、NtfsDisable8dot3NameCreationオプションが設定されているときにWindows 7エクスプローラーが "長すぎるパス"を処理する方法を見つけることです。


3
ここで説明されているように、MAX_PATHよりも長いパスを作成することできます。残念ながら、\\?` doesn't work with rmdir`。
grawity

@grawity、はい、それは同じプリンシパルの下で動作するためです。短いパスは長いパスに名前が変更されます。これは、変数を手動で名前を変更して1つに変更するのではなく、変数を展開することで動的に実行します。作成コマンドに合計長を決定するのに十分な情報がある場合、絶対パスが長すぎるディレクトリを作成することはできません。
Synetech

3
@Synetech:いいえ、動作が異なります。\\?\C:\dir\dir\dir\dir文字通り、MAX_PATH をバイパスするようなパス。関連する「変数」はありません。(しかし、私が言ったように、それは何らかの理由で、rmdirまたは他のcmd.exe
ビルトイン

たとえば、md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 ファイルシステムに合計パス長が263文字になると判断するのに十分な情報があるため、実行できません。失敗します。
Synetech

2
(また、パスの長さとコンポーネントの長さを混同しないでください。255文字を超える名前を持つ単一のディレクトリを作成することはできません。ただし、それよりもはるかに長いパスを使用できます。)
grawity

17

subst仮想ドライブの作成に使用することにより、パスを短縮できます。

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

仮想ドライブに変更します。

cd Z:

これで、ファイルを削除できます。

del *.*

仮想ドライブを削除します。

cd C:\TEMP
subst Z: /d

ディレクトリを削除します。

rd /s dir1

いや; ディレクトリが長すぎる場合、その最初のコマンドは機能しません。エラーInvalid parameterが返されます
Synetech

2
@Synetech、確かに、しかし、もしあなたがちょうどサブストをするならC:\TEMP\dir1\dir1\dir1、それはその一部を短くするので、あなたが入ることを可能にします。;)
ボブソン

@ボブソン、大丈夫です。あなたの両方のために+1。:-)
Synetech

10

Robocopyの不注意な使用とHomeserverからのバックアップによって生成された同様の非常に深い構造を削除するために、小さなC#アプリを作成しました。デフォルトでは、Robocopyはジョイントポイントを通常のフォルダーとして扱います... :-(気付かないうちに大きな混乱に陥ることがあります。

このツールは、だれでも使用できるように、ソースファイルとともにCodePlexで入手できます。

http://deepremove.codeplex.com


仕事!!! この答えは、機能しているとマークする必要があります!ソフトウェアはバターのように機能します。数秒で私の問題を解決しました!ありがとうございました!
ラフィクモハメッド

7

少し前に、このタスクを簡単に実行するために使用できるDeleteFilesという小さな自己完結型ユーティリティ実行可能ファイルを作成しました。

この自己完結型のユーティリティを使用すると、次のことが簡単にできます。

deletefiles c:\yourfolder\subfolder\*.* -r -f

フォルダー構造全体を削除します。-rは、開始ディレクトリから下のフォルダー階層を再帰し、-fは、空のフォルダーを削除します(filespecとしてを使用すると、すべてのフォルダーになります)。DeleteFilesは、WindowsのMAX_PATH制限より長いパスをサポートしているため、深くネストされたフォルダーで正常に機能します。

DeleteFilesは無料のオープンソースであり、GitHubからバイナリコードまたはソースコードを取得するか、Chocolateyを使用して直接インストールできます。


ありがとう、素晴らしいツール、それをチョコレートに入れるための++;)CIツールに簡単に統合できます!
チャールズOuellet

1
これでうまくいきました。本当に長いパスがある場合は> NUL、最後に追加することでプロセスを高速化できます。
ryscl

robocopyソリューションは私にとっても、Synetechのソリューションにとっても機能しませんでした。DeleteFilesは私のために機能しましたが、何らかの理由で、すべてのサブフォルダーを削除するために3回実行する必要がありました。いずれにせよ、これは私の問題を解決しました。
フランク

再:DeleteFilesを3回実行しています。私もそれを見てきました-それは、ファイルが削除された後でも、その中のファイルでフォルダを短時間ロックするいくつかのWindowsの癖によるものだと思います。複数のパスは、サブフォルダーでこの問題の偶発的な失敗をキャッチします-潜在的に複数のネスト。Explorerが深いツリーを削除しても同じ動作が見られます。
リック・シュトラール

5

シンプルで簡単

node_modulesが非常にネストされたフォルダであるため、この同じ問題に直面していました。最後に、パスを短くしてフォルダーを削除できるスクリプトを修正するスクリプトを作成しました。

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules

フラットな構造で作成できたのに、デザイナーが構造にすべての依存関係を含めることを選択した理由はわかりません。したがって、このスクリプトは、node.jsを既に使用しているため、私にとって最も簡単な方法でした
-user2610529

4

Sikuliでの作業中に、数え切れないほどの量の "calculator.sikuli.calculator.sikuli" dirsを作成するプログラムのCalculator.sikuli再帰ループに夢中になりました。ツリーを移動できましたが、パス名が長すぎて削除できません。

popd loop、Scandiskを使用していくつかのソリューションを試した後、(知覚的に)どこにも到達しません。

このスクリプトを作成して、再帰されたディレクトリ(「a」というディレクトリ)に「深く入り」、(「b」というディレクトリに)移動してから、切り捨てられたツリーを削除し、(「a」に)戻す、繰り返します:

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REMは無限に繰り返されるサブフォルダーを削除するために使用されます
  • REMは最初にWindows Searchサービスを停止することを提案します(services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

これは、バッチファイルを再度実行するための呼び出しです。


私はこれを調べるのに何時間も費やしました。この.batファイルは、天国からの贈り物のようなものです。あなた、サイロは天使です。xD
スキッシュ14年

2

eclipseがハードドライブにゴミを作成することを決めたとき、このような問題が発生しました。robocopyの/ MIR関数を使用して、空のディレクトリをネストされたディレクトリにミラーリングすることで修正しました。


1

私はコマンドプロンプトを開いて実行しようとします:

rmdir /s <directory>

それがうまくいかない場合は、ディレクトリツリーの途中でcdし、ディレクトリのサブセット(最も内側の20個のディレクトリなど)を削除してから、そこから抜け出します。


1
私は上記のご提案を試してみましたが、それはまだ、私はいくつかのレベルが深い上記のコマンドを実行すると、「ディレクトリが空ではない」と言う
user39186

1
それは、この方法が逆向きだからです。;-)
Synetech

1

ネットワークフォルダの場合は、そのディレクトリの親ディレクトリを共有し、ローカルマシンのドライブにマップしてから、フォルダを削除します。


21966 [main] mv 1288 D:\ work \ software \ cygwin \ bin \ mv.exe:***致命的なエラー-Windows環境の読み取り中の内部エラー-環境変数が多すぎますか?
user39186

私はAAサブフォルダが深い20個のレベルを入れ子にし、上記のエラーを得た移動しようとした
user39186

1

コマンドプロンプトを開きます。

最も高い 'dir1'を含むフォルダー/ディレクトリに移動します(C:\と仮定します)

c:\> RD /s dir1

編集 (コメント追加後)

他のアイデア:

MSは、ここで問題(多くのアイデア)に対処する方法に関する情報を提供しています。

このツールもあります(個人的に使用したことはありません)-TooLongPath

おそらく(Eclipseがあるので)ナビゲートして、一度に1つのフォルダーレベルをバックアウトし、それを削除していくようなものを書くでしょうか?


1
パスを見つけることができないシステムを空にされていない上記command.Theディレクトリを使用している間、私は、次の3のエラーを取得し、指定したファイル名が長すぎる
user39186

私が言って横断しようとした「n」のレベルの深さと同じコマンドを使用してみましたが、助けていないようだ
user39186

これはwin7でうまくいきました!感謝
leoh

1

別の解決策:Total Commanderをダウンロードしてください。長いファイル名に対応しているという理由だけでなく、非常に便利なプログラムです。

未登録バージョンはナグウェアですが、完全に機能し、仕事をします。


1

これは、削除するディレクトリへのUNCパスを作成することにより、コマンドラインから直接、またはバッチファイルで実行できます。

代わりに

rmdir /s/q c:\mydirectory

つかいます

rmdir /s/q \\?\c:\myDirectory

このようなUNCスタイルのパスははるかに長く、260文字の制限をバイパスできます。


動作しません。The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.Windows 7 64ビット。
ビクター

Windows 10では機能しません。まだ長すぎます。
BananaAcid

`\\?`バージョンはWindows 10で機能しました!
ピーター

0

この問題が発生した場合、フォルダー名の一部をはるかに短く名前を変更し、合計パスが十分に短くなったら削除します。追加のツールは必要ありません。


はい、しかし、私が言ったように、あなたは、外から仕事をしなければなりません、さもなければ、それは働きません。
Synetech

もちろん。通常、最も長いフォルダー名は、最初(パッチフォルダー内)または最後になる傾向があります。ほとんどの場合、1つまたは2つのフォルダー名を変更するだけで、適切な長さになります。
music2myear

はい。ただし、最も内側のものから開始すると、renコマンドはで失敗するため機能しませんpath too long
Synetech

1
はい、上記のスクリプトは、この問題を自動的に処理する賢明で効果的な方法です。それは数回しか起こらなかったので、手動の名前変更プロセスを使用しました。そのためには、問題のあるツリーのどこにいてもフォルダー構造の名前を変更するだけです。私の経験では、ツリー構造の最初または最後に最も長いフォルダー名がより頻繁に表示されます。したがって、私の答えは有効なものですが、おそらくここでは最強でも賢明でもありません。それは下票の価値はありません。
music2myear

>違反しているツリーのどこにいてもフォルダ構造の名前を変更するだけです。そうです、すでにツリー内にいる場合は、少なくともそのフォルダの名前を変更できます(親に移動する必要があります) ; サブフォルダーの名前も変更できる場合がありますが、長すぎる可能性があります。
Synetech

0

再帰的なCobianバックアップタスクによって作成されたことを除いて、同じ問題がありました。私が判明無料Cobianソフトウェアは簡単に超迅速これらの厄介なネストされたフォルダを削除することができDELETERアプリケーションが含まれています。

ツールメニューの下にあります。


0

いくつかのJavaアプリケーションが行った5000以上のディレクトリディープフォルダーの混乱で同じ問題に遭遇し、このフォルダーを削除するのに役立つプログラムを作成しました。ソースコード全体はこのリンクにあります:

https://gitlab.imanolbarba.net/imanol/DiREKT

しばらくしてすべてが削除されましたが、なんとか仕事をすることができました。同じようにイライラする問題に直面する人々を助けることを願っています


-3

ファイルシステムが破損している可能性があります。chkdskを実行して、何かが修復されるかどうかを確認してから、フォルダーを削除してみます。


いいえ、それは問題ではありません。問題は、合計パス長がサポートされている長さよりも長いことです(MAX_PATH=255)。これ、破損していないファイルシステムでも発生する可能性があります。
Synetech

フォルダでchkdskを実行すると、次のエラーが発生しました。ドライブ、パス、またはファイル名が有効ではありません
user39186
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.