Bagaimana cara menghapus folder yang bersarang cukup dalam dan menghindari "Nama file terlalu panjang"?

70

Eclipse membuat folder temp di salah satu direktori yang bersarang cukup dalam, misalnya

dir1\dir1\dir1\dir1\...

Saya tidak dapat menghapus folder ini di Windows melalui Explorer, delatau rmdirperintah, atau perintah Cygwin 'rm'. Bagaimana saya harus menghapus folder yang sangat panjang ini?

Itu hanya terus mengatakan "Nama file terlalu panjang ..."

pengguna39186
sumber

Jawaban:

105

Jika Anda seperti saya dan tidak ingin menginstal perangkat lunak tambahan untuk memperbaiki masalah seperti ini, saya akan pergi dengan saran XQYZ dan gunakan robocopyuntuk menyelesaikan masalah. (Dalam kasus saya, masalah pertama kali diciptakan oleh robocopy, dengan menyalin direktori yang memiliki titik persimpangan rekursif di dalamnya tanpa memasok / XJ ke robocopy).

Untuk menghapus pohon direktori mulai dari c: \ subdir \ lebih \ offending_dir :

Total langkah demi langkah prosesnya sesederhana ini:

  1. cd c:\subdir\more untuk cd ke direktori induknya.
  2. mkdir empty untuk membuat direktori kosong.
  3. robocopy empty offending_dir /mir untuk mencerminkan direktori kosong ke direktori yang menyinggung.
  4. Setelah menunggu, Anda selesai! Akhiri dengan:
  5. rmdir offending_dir untuk menyingkirkan direktori menyinggung yang sekarang kosong dan
  6. rmdir empty untuk menyingkirkan direktori kosong perantara Anda.
jofafrazze
sumber
2
Saran yang bagus. Masalah saya juga dibuat oleh robocopy, dan seperti yang Anda jelaskan perbaikan robocopy bekerja untuk saya.
Nathan Garabedian
3
Saya juga membuat kekacauan robocopydan titik persimpangan; terima kasih telah menunjukkan kepadaku cara menggunakannya untuk membersihkan kekacauan!
Mr.Wizard
folder saya tidak dibuat oleh robocopy tetapi dihapus dengan sempurna
Sasha
11
Pengelola paket simpul (NPM) menyebabkan masalah ini bagi saya. Ada begitu banyak paket bersarang untuk beberapa alasan.
David Sherret
ini jelas jawaban terbaik dan paling masuk akal, jauh lebih baik daripada skrip batch rekursif yang dipesan lebih dahulu
monastic-panic
39

Ini sebenarnya cukup mudah untuk diperbaiki. Katakan bahwa struktur direktori adalah seperti itu:

C:\Dir1\Dir1\Dir1\Dir1…

Untuk memperbaikinya, cukup ganti nama setiap folder menjadi nama folder satu karakter hingga tidak lagi terlalu lama untuk dihapus:

  1. Ganti nama C:\Dir1menjadiC:\D
  2. Navigasi ke C:\D\
  3. Ganti nama C:\D\Dir1menjadiC:\D\D
  4. Navigasi ke C:\D\D\
  5. Goto 1 hingga total panjang lintasan <260

Berikut adalah file batch untuk mengotomatiskan proses (versi sederhana ini terbaik untuk direktori sederhana seperti yang dijelaskan dalam pertanyaan, terutama untuk yang sekali pakai). Berikan folder tertinggi yang mungkin (misalnya C:\Dir1untuk C:\Dir1\Dir1\Dir1…atau C:\Users\Bob\Desktop\New Folderuntuk 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

Penjelasan Teknis

Solusi yang diusulkan lainnya mundur; Anda tidak dapat memperbaikinya dengan bekerja dengan cara Anda dari direktori paling dalam ke luar, Anda harus pergi ke arah lain.

Ketika Anda mencoba mengakses direktori, Anda melakukannya menggunakan jalur absolutnya apakah secara eksplisit atau tidak, yang mencakup semua yang datang sebelumnya. Oleh karena itu, untuk struktur direktori seperti C:\Dir1\Dir1\Dir1\Dir1, panjang jalur ke terdalam Dir1adalah 22. Namun panjang jalur ke terluar Dir1hanya 7, dan karena itu masih dapat diakses terlepas dari isinya (dalam konteks jalur direktori tertentu yang diberikan , sistem file tidak memiliki pengetahuan tentang apa yang dikandungnya atau efeknya terhadap total panjang path direktori anak-anaknya; hanya direktori leluhurnya - Anda tidak dapat mengganti nama direktori jika total panjang path terlalu panjang).

Oleh karena itu, ketika Anda menemukan jalan yang terlalu panjang, apa yang perlu Anda lakukan adalah pergi ke tingkat tertinggi yang mungkin dan ganti namanya menjadi nama satu karakter dan ulangi untuk setiap tingkat di dalamnya. Setiap kali Anda melakukannya, total panjang jalan lebih pendek dengan perbedaan antara nama lama dan nama baru.

Yang sebaliknya juga benar. Anda tidak dapat membuat jalur yang lebih besar dari panjang maksimum yang didukung (pada DOS dan Windows, MAX_PATH = 260). Namun, Anda dapat mengubah nama direktori, mulai dari yang paling dalam, menjadi nama yang lebih panjang. Hasilnya adalah folder yang lebih dalam yang jalur absolutnya> 260 tidak dapat diakses. (Itu tidak membuat mereka “tersembunyi” atau aman, karena mereka cukup sederhana untuk mendapatkannya, jadi jangan gunakan metode ini untuk menyembunyikan file.)


Catatan Sisi Menarik

Jika Anda membuat folder di Windows 7 Explorer, sepertinya Explorer memungkinkan Anda membuat subdirektori sedemikian rupa sehingga total panjangnya lebih panjang daripada MAX_PATH, dan sebenarnya itu adalah penjelmaan, namun sebenarnya curang dengan menggunakan "nama file DOS 8.3". Anda dapat melihat ini dengan membuat pohon seperti berikut:

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

Panjangnya 696 karakter, yang tentu saja jauh lebih panjang dari 260. Selanjutnya, jika Anda menavigasi ke subdirektori terdalam di Explorer, itu menunjukkannya seperti yang diharapkan di bilah alamat ketika tidak dalam fokus, tetapi ketika Anda mengklik alamat bar, itu mengubah jalur ke C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, yang hanya 102 karakter.

Di XP, ia tidak melakukan ini, sebaliknya ia menolak untuk membuat jalan yang lebih panjang daripada yang didukung.

Apa yang benar-benar menarik adalah untuk mengetahui bagaimana Windows 7 Explorer menangani "path terlalu panjang" ketika NtfsDisable8dot3NameCreationopsi diatur.

Synetech
sumber
3
Hal ini dimungkinkan untuk membuat jalan lebih lama dari MAX_PATH, seperti dijelaskan di sini . Sayangnya, \\?` doesn't work with rmdir`.
grawity
@ kegembiraan, ya, tapi itu karena ia bekerja di bawah prinsip yang sama: jalur pendek diubah namanya menjadi lebih panjang; yang hanya melakukannya secara dinamis dengan memperluas variabel yang bertentangan dengan mengubah nama secara manual ke la onger satu. Tidak mungkin membuat direktori yang jalur absolutnya terlalu panjang ketika perintah pembuatan memiliki informasi yang cukup untuk menentukan panjang total.
Synetech
3
@ Sinetech: Tidak, ini bekerja secara berbeda. Jalur seperti \\?\C:\dir\dir\dir\dirsecara harfiah memotong MAX_PATH; tidak ada "variabel" yang terlibat. (Tapi seperti yang saya katakan, itu tidak bekerja dengan rmdiratau cmd.exebuiltin lain karena beberapa alasan.)
grawity
misalnya, coba jalankan md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Ini tidak akan berfungsi karena sistem file memiliki informasi yang cukup untuk menentukan bahwa panjang jalur total akan menjadi 263 karakter, sehingga gagal.
Synetech
2
(Juga, jangan bingung panjang path dengan panjang komponen . Anda tidak dapat memiliki direktori tunggal dengan nama lebih dari 255 karakter; namun, Anda dapat memiliki path lebih lama dari itu.)
grawity
17

Anda dapat mempersingkat jalur dengan menggunakan substuntuk membuat drive virtual:

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

Ubah ke drive virtual:

cd Z:

Sekarang Anda dapat menghapus file:

del *.*

Hapus drive virtual:

cd C:\TEMP
subst Z: /d

Hapus direktori:

rd /s dir1
Matthew Simoneau
sumber
Nggak; perintah pertama itu tidak akan berfungsi jika direktori terlalu panjang; itu akan mengembalikan kesalahan parameter tidak valid .
Synetech
2
@Synetech, tentu saja, tetapi jika Anda mengganti saja C:\TEMP\dir1\dir1\dir1, maka itu akan mempersingkat bagiannya, sehingga memungkinkan Anda untuk masuk. Ini sama seperti saran Anda untuk mengganti nama, tetapi dengan pemetaan sebagai gantinya. ;)
Bobson
@ Bobson, oke Anda benar; +1 untuk Anda berdua. :-)
Synetech
10

Saya menulis aplikasi C # kecil untuk membantu saya menghapus struktur yang sangat dalam serupa yang dihasilkan oleh penggunaan Robocopy yang ceroboh dan cadangan dari Homeserver; secara default Robocopy memperlakukan poin bersama sebagai folder biasa ... :-( Anda mungkin berakhir dengan kekacauan besar tanpa menyadarinya.

Alat ini tersedia di CodePlex dengan file sumber, untuk digunakan siapa saja.

http://deepremove.codeplex.com

JPJofre
sumber
BEKERJA !!! Jawaban ini harus ditandai berfungsi! Perangkat lunak ini bekerja seperti mentega .. memecahkan masalah saya dalam beberapa detik !! Terima kasih!
Rafique Mohammed
7

Beberapa waktu yang lalu saya membuat sebuah utilitas kecil yang dapat dieksekusi yang disebut DeleteFiles yang dapat Anda gunakan untuk melakukan tugas ini dengan mudah.

Menggunakan utilitas mandiri ini yang bisa Anda lakukan:

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

untuk menghapus seluruh struktur folder. -r mengulang hierarki folder dari direktori awal ke bawah, -f menghapus folder yang kosong (yang akan menjadi semuanya jika Anda menggunakan . sebagai filespec). DeleteFiles mendukung jalur yang lebih panjang dari batas Windows MAX_PATH sehingga akan berfungsi dengan baik pada folder yang sangat bersarang.

DeleteFiles gratis dan open source dan Anda dapat mengambil kode biner atau sumber dari GitHub atau menginstal langsung menggunakan Chocolatey

Rick Strahl
sumber
Terima kasih, alat luar biasa, ++ untuk membuatnya cokelat;) Memudahkan untuk diintegrasikan dalam alat CI!
Charles Ouellet
1
Ini berhasil. Jika Anda memiliki jalur yang sangat panjang, menambahkan > NULsampai akhir dapat membuat proses lebih cepat.
ryscl
Solusi robocopy tidak bekerja untuk saya dan juga solusi Synetech. DeleteFiles bekerja untuk saya, tetapi untuk beberapa alasan saya harus menjalankannya tiga kali agar semua subfolder dihapus. Bagaimanapun, ini memecahkan masalah saya.
Frank
Re: menjalankan DeleteFiles 3 kali. Saya telah melihatnya juga - saya percaya itu karena beberapa kebiasaan Windows yang mengunci folder dengan file di dalamnya untuk waktu yang singkat bahkan setelah file telah dihapus. Beberapa operan menangkap kegagalan sesekali masalah ini dalam subfolder - berpotensi multi-bersarang. Saya melihat perilaku yang sama dengan Explorer menghapus pohon dalam.
Rick Strahl
5

Sederhana & Mudah Sekarang

saya menghadapi masalah yang sama sejak lama dengan node_modules yang sangat bersarang folder. jadi akhirnya dibuat skrip untuk memperbaiki apa yang bisa menghapus folder dengan memperpendek jalur.

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

npm install fdel -g

fdel ./node_modules
dev.meghraj
sumber
Saya tidak tahu mengapa para desainer memilih untuk memasukkan setiap ketergantungan dalam struktur ketika mereka bisa membuatnya dengan struktur datar. Jadi skrip ini adalah cara termudah bagi saya karena saya sudah menggunakan node.js
user2610529
4

Saat bekerja dengan Sikuli, saya didongkrak dengan loop rekursi Calculator.sikuli dalam program yang membuat jumlah "kalkulator.sikuli.kalator.sikuli" yang tak terhitung jumlahnya. Saya bisa memindahkan pohon, tetapi pathname terlalu lama untuk dihapus.

Setelah mencoba beberapa solusi dengan popd loop, Scandisk dan mendapatkan (jelas) di mana saja ....

Saya menulis skrip ini untuk 'masuk lebih dalam' ke direktori yang berulang (dalam direktori yang disebut 'a'), memindahkannya (ke direktori yang disebut 'b'), kemudian menghapus pohon yang terpotong, memindahkannya kembali (ke 'a') , dan ulangi:

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 Digunakan untuk menghapus subfolder berulang berulang
  • REM menyarankan untuk menghentikan layanan Pencarian Windows terlebih dahulu (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

Ini hanya panggilan untuk menjalankan file batch lagi.

SiloSix
sumber
Saya telah menghabiskan berjam-jam melihat ke dalam ini. File .bat ini seperti hadiah dari surga. Anda, silo, adalah malaikat. xD
Squish
2

Kami memiliki masalah seperti ini di tempat kerja ketika gerhana memutuskan untuk membuat sampah di harddisk. Kami memperbaikinya dengan menggunakan fungsi robocopy / MIR untuk mencerminkan direktori kosong ke direktori bersarang.

XQYZ
sumber
1

Saya akan mencoba membuka command prompt dan menjalankan:

rmdir /s <directory>

Jika itu tidak berhasil, saya akan melakukan cd setengah jalan ke pohon direktori dan mencoba untuk menghapus bagian dari direktori - katakanlah 20 direktori terdalam - dan kemudian bekerja dengan cara saya keluar dari sana.

Jesse S.
sumber
1
Saya mencoba saran Anda di atas dan masih tertulis "Direktori tidak kosong" ketika saya menjalankan perintah di atas beberapa level
user39186
1
Itu karena metode ini mundur. ;-)
Synetech
1

Jika itu adalah folder jaringan maka cukup bagikan direktori induk direktori itu dan petakan ke drive di mesin lokal Anda dan kemudian hapus folder Anda.

Punnakadu
sumber
21966 [utama] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** kesalahan tal - kesalahan internal membaca lingkungan windows - terlalu banyak variabel lingkungan?
user39186
Saya mencoba memindahkan sub-folder bersarang 20 tingkat dalam dan mendapat kesalahan di atas
user39186
1

Buka prompt perintah.

Arahkan ke folder / direktori yang berisi 'dir1' tertinggi (kami akan menganggap C: \)

c:\> RD /s dir1

Edit (setelah komentar ditambahkan) :

Ide lain:

MS menawarkan info tentang cara mengatasi masalah (banyak ide untuk dicoba) di sini .

Ada juga alat ini (tidak pernah menggunakannya secara pribadi) - TooLongPath .

Mungkin menulis sesuatu (karena Anda memiliki Eclipse) yang menavigasi sepanjang jalan dan kemudian mundur satu tingkat folder sekaligus, menghapus saat berjalan?

Ƭᴇcʜιᴇ007
sumber
1
Saya mendapatkan 3 kesalahan berikut saat menggunakan perintah di atas. Direktori tidak kosong. Sistem tidak dapat menemukan jalur yang ditentukan. Nama file terlalu panjang
user39186
Saya mencoba melintasi katakan 'n' level dalam dan mencoba menggunakan perintah yang sama, tetapi tampaknya tidak membantu
user39186
ini bekerja untuk saya di win7! terima kasih
leoh
1

Solusi lain: masuk unduh Total Commander. Ini adalah program yang sangat berguna, bukan hanya karena itu nama file yang panjang.

Versi tidak terdaftar adalah nagware tetapi berfungsi penuh, itu akan melakukan pekerjaan.

Loren Pechtel
sumber
1

Ini dapat dilakukan langsung dari baris perintah atau dalam file batch dengan membangun jalur UNC ke direktori yang ingin Anda hapus

jadi alih-alih

rmdir /s/q c:\mydirectory

menggunakan

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

Jalur gaya UNC seperti ini bisa lebih lama dan melewati batas 260-char.

Steve Cooper
sumber
Tidak bekerja 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-bit.
Victor
Tidak bekerja untuk windows 10. Masih terlalu lama.
BananaAcid
Versi `\\?` Bekerja untuk saya di windows 10!
Peter
0

Ketika saya memiliki masalah ini, saya cukup mengganti nama beberapa nama folder menjadi lebih pendek, kemudian setelah total path cukup pendek, itu akan menghapus OK. Tidak perlu alat tambahan.

music2myear
sumber
Ya, tapi seperti yang saya katakan, Anda harus bekerja dari luar, jika tidak, itu tidak akan berhasil.
Synetech
Tentu saja. Saya biasanya menemukan nama folder terpanjang cenderung menjadi yang pertama (di folder patch) atau yang terakhir. Sebagian besar waktu, Anda hanya perlu mengubah satu atau dua nama folder agar panjangnya tepat.
music2myear
Ya, tetapi jika Anda mulai dengan yang paling dalam, itu tidak akan berhasil karena renperintahnya akan gagal path too long.
Synetech
1
Ya, skrip yang disediakan di atas adalah metode cerdas dan efektif untuk menangani masalah ini secara otomatis. Itu hanya terjadi pada saya beberapa kali dan karenanya saya cukup menggunakan proses mengubah nama secara manual. Untuk melakukan itu saya cukup mulai mengubah nama struktur folder di mana pun saya berada di pohon yang menyinggung, dan pengalaman saya adalah nama folder terpanjang muncul lebih sering di awal atau di akhir struktur pohon. Karena itu jawaban saya valid, meskipun mungkin bukan yang terkuat atau terpintar di sini. Tidak ada gunanya downvote.
music2myear
> Saya cukup mulai mengubah nama struktur folder di mana pun saya berada di pohon yang menyinggung Yah, ya, jika Anda sudah berada di dalam pohon, maka Anda tentu dapat mengubah nama setidaknya folder itu (Anda harus pergi ke induknya) ; Anda mungkin dapat mengganti nama subfolder juga, tetapi mungkin terlalu lama.
Synetech
0

Saya memiliki masalah yang sama, kecuali itu diciptakan oleh tugas Cobian Backup rekursif. Saya ternyata perangkat lunak Cobian gratis termasuk aplikasi Deleter yang dapat dengan mudah menghapus folder bersarang sial ini dengan sangat cepat.

Itu terletak di bawah menu alat.

mrshl
sumber
0

Saya memang mengalami masalah yang sama dengan kekacauan folder direktori sedalam 5000+ yang dilakukan oleh beberapa aplikasi Java dan saya menulis sebuah program yang akan membantu Anda menghapus folder ini. Seluruh kode sumber ada di tautan ini:

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

Ini menghapus semuanya setelah beberapa saat, tetapi berhasil melakukan pekerjaan, saya harap itu membantu orang-orang yang (seperti saya), mengalami masalah yang sama membuat frustrasi

Imanol Barba Sabariego
sumber
-3

Sistem file Anda mungkin rusak. Jalankan chkdsk untuk melihat apakah ada perbaikan, lalu coba hapus folder.

penyulap
sumber
Tidak, bukan itu masalahnya. Masalahnya adalah bahwa panjang jalur total lebih panjang dari yang didukung ( MAX_PATH=255). Ini dapat terjadi bahkan dengan sistem file yang tidak korup.
Synetech
Menjalankan chkdsk pada folder memberi saya kesalahan berikut. Drive, path, atau nama file tidak valid
user39186