web-dev-qa-db-ja.com

ネストされているフォルダを削除して "ファイル名が長すぎます"のを避けるにはどうすればよいですか?

Eclipseはディレクトリの1つに一時フォルダを作成しました。

dir1\dir1\dir1\dir1\...

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

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

67
user39186

あなたが私のようで、このような問題を解決するために追加のソフトウェアをインストールしたくない場合は、 XQYZの提案 を使ってrobocopyを使ってください。問題を解く。 (私の場合、問題は最初にrobocopyによって、再帰接合点を持つディレクトリをrobocopyに提供せずにコピーすることによって発生しました)。

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

ステップバイステップのプロセス全体は、これと同じくらい簡単です。

  1. 親ディレクトリに移動するcd c:\subdir\more
  2. 空のディレクトリを作成するためのmkdir empty
  3. 空のディレクトリを問題のあるディレクトリにミラーリングするrobocopy empty offending_dir /mir
  4. しばらく待ってから完了です。でそれを終わらせる:
  5. rmdir offending_dirは今空の問題のディレクトリを取り除くために
  6. あなたの中間の空のディレクトリを取り除くためにrmdir empty
100
jofafrazze

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

C:\Dir1\Dir1\Dir1\Dir1…

それを修正するには、削除するには長すぎなくなるまで、各フォルダの名前を1文字のフォルダ名に変更します。

  1. C:\Dir1C:\Dに名前変更します
  2. C:\D\に移動します
  3. C:\D\Dir1C:\D\Dに名前変更します
  4. C:\D\D\に移動します
  5. パスの全長が<260になるまで1に進む

これはプロセスを自動化するためのバッチファイルです(この単純なバージョンは、質問で説明されているような単純なディレクトリ、特に使い捨てのディレクトリに最適です)。それを可能な限り高いフォルダに渡してください(例:C:\Dir1の場合はC:\Dir1\Dir1\Dir1…C:\Users\Bob\Desktop\New Folderの場合は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です。ただし、最も外側のDir1へのパスの長さは7だけです。したがって、その内容に関係なく引き続きアクセスできます。与えられたディレクトリのパスでは、ファイルシステムはそれが何を含んでいるのか、あるいはそれがその子ディレクトリのトータルパス長に与える影響については知りません;その先祖ディレクトリのみ - トータルパス長が長すぎる場合はディレクトリ名を変更できません).

したがって、長すぎるパスに遭遇したときにできることは、可能な限り最高レベルに進み、その名前を1文字の名前に変更し、そのレベルごとに繰り返すことです。変更するたびに、古い名前と新しい名前の違いによってパスの合計長が短くなります。

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


興味深いサイドノート

Windows 7のエクスプローラでフォルダを作成する場合、エクスプローラでサブディレクトリを作成して全体の長さを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エクスプローラが「長すぎるパス」をどのように処理するかを調べることです。

38
Synetech

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
16

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

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

http://deepremove.codeplex.com

10
JPJofre

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

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

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

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

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

7
Rick Strahl

シンプル&イージーナウ

とても長い間ネストされたフォルダを持つnode_modulesで私はこれと同じ問題に直面していました。パスを短くすることでフォルダを削除できるスクリプトを修正しました。

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

npm install fdel -g

fdel ./node_modules
5
dev.meghraj

Sikuliを使って作業している間、私はプログラムの中に "calculator.sikuli.calculator.sikuli"という数えきれないほどの量を作成したCalculator.sikuli再帰ループを使用しました。ツリーを移動できますが、パス名を削除するには長すぎます。

Popdループでいくつかの解決策を試した後、スキャンディスクを実行して、(知覚できるほど)どこにも行かなくなりました。

私はこのスクリプトを書き、再帰されたdirの中に深く入り(aと呼ばれるdirに)、それらを(bと呼ばれるdirに)移動し、そして切り捨てられた木を削除し、(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

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

4
SiloSix

Eclipseがハードドライブ上にゴミを作成することを決めたとき、私たちはこのような問題を抱えていました。 robocopyの/ MIR関数を使って空のディレクトリを入れ子にしたものにミラーリングすることで修正しました。

2
XQYZ

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

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

c:\> RD /s dir1

編集(コメント追加後)

その他のアイデア:

MSはこの問題にどう対処するかについての情報を提供しています(たくさんのアイデアを試してみてください) こちら

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

たぶん、(あなたがEclipseを持っているので)何度もたどり着き、それから一度に一つのフォルダレベルをバックアウトする何かを書く?

1

コマンドプロンプトを開いて実行してみます。

rmdir /s <directory>

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

1
Jesse S.

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

1
Punnakadu

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

未登録のバージョンは、知識がありませんが、完全に機能します、それは仕事をします。

1
Loren Pechtel

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

そうではなく

rmdir /s/q c:\mydirectory

つかいます

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

このようなUNCスタイルのパスはもっと長くなり、260文字の制限を回避できます。

1
Steve Cooper

私は同じ問題を抱えていましたが、それは再帰的なCobian Backupタスクによって作成されたものです。私は 無料のCobianソフトウェア に、これらの厄介な入れ子になったフォルダを簡単にすばやく簡単に削除できるDeleterアプリケーションが含まれていることがわかりました。

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

0
mrshl

私がこの問題を抱えているとき、私は単にフォルダ名のいくつかをもっともっと短く名前を変更し、そして完全なパスが十分に短くなると、それはOKを削除します。追加のツールは必要ありません。

0
music2myear

私はいくつかのJavaアプリケーションがした5000+ディレクトリ深さのフォルダの混乱で同じ問題に遭遇しました、そして、私はあなたがこのフォルダを削除するのを助けるプログラムを書きました。ソースコード全体はこのリンクにあります。

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

それはしばらくして全てを取り除きました、しかしそれは仕事をすることに成功しました。