Как удалить файл в Windows со слишком длинным именем файла?

360661
user3048

У моей жены есть несколько файлов и папок, которые каким-то образом оказались с именами файлов, из-за которых их невозможно было удалить (нельзя удалить) обычным способом или через командную строку. Я считаю, что имена файлов слишком длинные из-за глубины структуры папок. Кто-нибудь знает хорошую утилиту для очистки таких файлов?

195
Как были созданы эти файлы? Nick 13 лет назад 0
Извините за мое незнание этой темы, но разве Windows не должна обрабатывать эти файлы? Разве то, что будет опубликовано Эддинсом, не должно быть сделано автоматически Windows (даже из проводника)? Stefanos Kalantzis 11 лет назад 0
@ Mokubai- Повторяющийся вопрос должен быть помечен как дубликат этого, так как ** этот вопрос старше **. cybermonkey 9 лет назад 2
@cybermonkey: И у него есть лучший ответ. Ellesedil 8 лет назад 1
For further readers, the [7zip Method with `CTRL` + `DELETE`](http://superuser.com/a/78458/437813) is the easiest method in my opinion... Christian Gollhardt 8 лет назад 0
https://superuser.com/a/1263183/439537 Andrew 7 лет назад 0

8 ответов на вопрос

416
Benoit

When you want to completely delete a directory and it has file with long names inside it, robocopy does a VERY good job:

mkdir empty_dir robocopy empty_dir the_dir_to_delete /s /mir rmdir empty_dir rmdir the_dir_to_delete 

This works because robocopy internally uses the Unicode-aware versions of Win32 functions, with the \\?\ prefix for file paths; those functions have a limit of 2¹⁶-1 (32,767) characters instead of 259.

You may need to go through this process more than once to get rid of all of the files.

Эффективно, когда в файловой системе нет краткого имени (8.3). Antoine RODRIGUEZ 11 лет назад 1
У меня было 8,3 имени файла, но они не работали. Это сработало. Ciantic 10 лет назад 0
Это хорошо работало с моим упрямым Магазином Windows [файлы кэша] (http://superuser.com/questions/724427/what-is-a-0-namespace-http-file-and-how-to-delete-it), который отказался быть удаленным. Спасибо! Samir 10 лет назад 1
Я должен был добавить / очистить к линии robocopy, чтобы это работало, но после этого все получилось actionshrimp 10 лет назад 1
@actionshrimp, `/ MIR` подразумевает` / PURGE`. Я не понимаю, как добавление `/ PURGE` может изменить поведение! Benoit 10 лет назад 0
Robocopy - вот что привело меня в этот беспорядок, но мне никогда не приходило в голову использовать Robocopy, чтобы вытащить меня из этого. Отличный ответ! Спасибо! Jay Michaud 10 лет назад 3
@Benoit: 2³² ??? Святое дерьмо, это большое число! > _ < SarahofGaia 9 лет назад 0
@ bgallagh3r: это много интернетов. В частности, вы говорите, что они выигрывают 10⁴ × 59,9 EiB = 599 000 EiB. Это 585 ZiB, или 691 ZB !!! Вы уверены, что они достойны такого количества данных ?! > _ < SarahofGaia 9 лет назад 0
@Benoit: я пока не понимаю командную строку до такого уровня. Для примера, который вы привели, я просто наберу то, что вы там напечатали? И если да, то что мне заменить на что? SarahofGaia 9 лет назад 0
Хорошая идея, но у меня не получилось с 10-ю рекурсивными папками. Работал только римраф. Julian Knight 9 лет назад 0
@SarahofGaia, мой плохой, это 2¹⁶ - 1 на самом деле Benoit 9 лет назад 2
Сохранено днем ​​... Manoj Attal 8 лет назад 1
Удивительный ответ, это похоже на старое и для простых смертных запрещено Windows Power aliopi 8 лет назад 0
Отличный ответ! Гораздо лучше, чем те, которые говорят вам переименовать вручную или удалять файлы по отдельности - с этим вы можете просто запустить его, вернуться через некоторое время, и все готово. Может быть стоит добавить к ответу, что robocopy поставляется с последними версиями Windows (Vista +) - я не был знаком с этим и предположил, что некоторые другие могут не быть. Steve Chambers 8 лет назад 0
@Benoit: Согласно справке командной строки robocopy, / MIR эквивалентно / E plus / PURGE, так значит ли это, что / S не нужно? (/ E такой же, как / S, но содержит пустые подкаталоги) Avalanchis 8 лет назад 0
основной пример не работал на windows 10 ... не копировал ни один из файлов из каталога ...] Я думаю, что проблема с юникодом была в первую очередь ... большинство американских разработчиков не учитывают большинство людей в мире не используют английский. Dawesi 8 лет назад 0
Работает отлично, но медленно. eomeroff 8 лет назад 0
Это прекрасно работает. Я разработчик javascript / angular. Модули, установленные через npm, всегда вызывают одни и те же проблемы, и я использую эту команду для удаления этих модулей, у меня этот ответ добавлен в закладки в моем браузере. @Benoit Большое спасибо ... Paulson Peter 7 лет назад 0
идеальный ответ! Monis 7 лет назад 0
Это не работает, когда проблема - весь путь, а не только имя файла. Robocopy не может удалить файлы в этой ситуации. Martin Argerami 7 лет назад 0
90
Will Eddins

Из командной строки:

dir /X 

Это перечислит ваши файлы / папки в формате короткого имени. Затем используйте короткое имя в точности как написано, чтобы удалить файл:

del LONGF~1.txt 
Мне это нравится, это приятное боковое мышление. Col 15 лет назад 1
Хотя я не могу гарантировать, что в этом случае это сработает, я несколько раз использовал его для удаления папок с недопустимыми символами в конце, которые делают невозможным их удаление обычными средствами. Will Eddins 15 лет назад 0
Я просто использовал эту технику для удаления файла с неправильным именем файла - это был файл с именем "},". Этот совет решил это. Спасибо Гвардии. Charles Roper 15 лет назад 0
Это работает для файлов и папок в текущем каталоге, но если вам каким-то образом удается найти себя ** внутри ** папки, путь которой слишком длинный, это не поможет. Например, я в данный момент нахожусь в консоли по слишком длинному пути и не могу даже `dir` или` cd ..`. Bobson 12 лет назад 1
@Bobson Если вы не можете использовать `dir`, используйте` pushd`. Это сработало для меня. BadHorsie 10 лет назад 1
Спасибо за это простое решение очень надоедливой проблемы! DeathByTensors 10 лет назад 0
Работал на меня. Я на Windows 7, кстати fedmich 7 лет назад 0
Это не работает с Windows 10, отображаемое имя файла является длинным Loenix 7 лет назад 3
52
joeqwerty

Я продвигаюсь по пути, переименовывая каждую последующую родительскую папку в «1» и пытаясь удалить. Вы эффективно сокращаете путь каждый раз, и мне никогда не приходилось работать с более чем 4 или 5 каталогами, пока я наконец не смогу удалить всю структуру каталогов (что может или не может быть тем, что вы хотите). Вы также можете сделать это из последней дочерней папки и двигаться вверх или вниз.

Это было единственное, что сработало для меня. Все остальные трюки, приведенные здесь и на других форумах, подобные этому, не сработали. Andrew Arnott 13 лет назад 7
Рад помочь... joeqwerty 13 лет назад 3
Было единственным предложением, которое работало достаточно странно. Nestor Ledon 10 лет назад 0
Это сработало для меня, ярлык, который мне помог, был `mv * 1 && cd 1`. Это не сработало, когда в каталоге было несколько файлов, но в этот момент обычно выполнялся `rm -rf *`. Alexander Varwijk 9 лет назад 0
@ Александр: Возможно, ваше предложение не по теме, потому что этот вопрос помечен [windows]. Если только вы не предполагаете, что это может быть необходимо даже с живым компакт-диском Linux. Или вы предлагаете Cygwin, как это было сделано [здесь] (http://superuser.com/a/817319/150988). Теперь, когда этот вопрос закрыт как дубликат, вы можете повторно опубликовать свой комментарий к другому. Scott 9 лет назад 0
Я думал, что я как-то заставил вышеупомянутую работу на окнах (без каких-либо дополнительных инструментов). Однако способ, которым я это записал, конечно, не работает. К сожалению, сейчас я не могу воспроизвести его: / Возможно, я просто пропустил тег Windows. Alexander Varwijk 9 лет назад 0
Возможность исправить это быстро без дополнительного программного обеспечения была большой победой в моей книге! хорошая работа Bobby Borszich 9 лет назад 0
Не могу сделать это в Windows 10 ... переименовать выбрасывает "имя файла в длинную" ошибка Dawesi 8 лет назад 1
Работал для моих целей в окне 7. Пришлось переименовывать более 7 папок. Damon 7 лет назад 0
Это не только решило проблему для меня, но также объясняет, как я в конечном итоге решил проблему. У меня должен был быть путь, который был близок к пределу, затем я переименовал родительскую папку (добавил что-то вроде «резервное копирование в ноябре 2016 года» к названию), что привело к превышению лимита файлов в подпапках. Приятно знать причину, а также решение, хотя я знаю, что это может произойти и другими способами, я думаю, что это распространенный способ, которым это происходит с людьми. eselk 7 лет назад 2
Единственный, который работал для меня в Windows 10, спасибо! ;) Такая глупая вещь на самом деле. Я не могу поверить, что MS позволит создавать файлы, которые люди не могут удалить. Просто добавьте в мой список глупостей, которые делает Windows (MS). James Wilkins 7 лет назад 0
13
grawity

В некоторых программах, включая Command Prompt ( cmd.exe), вы можете обойти ограничение длины файла, добавив префикс полного пути \\.\следующим образом:

\\. \ C: \ некоторый каталог \ другой каталог \ файл с длинным именем
не работает в Windows 10 Dawesi 8 лет назад 2
спасибо, cmd работал с этим в Win7 `rm -rf \\ directoryname` Philip Pryde 7 лет назад 0
13
AdamV

Хитрость, которую я использовал, чтобы обойти ограничение длины «полный путь и имя файла» для перемещения, копирования или удаления чего-либо, состоит в том, чтобы сократить его путем «взлома» на полпути (или более) с использованием сопоставленной буквы диска, указывающей на папку путь вниз по пути .

так что у вас есть c: \ some \ long \ path ... \ и \ foo \ bar \ folder \ oldfiles \ myoldfile.txt.

Затем сопоставьте произвольную букву диска где-нибудь вдоль пути, чтобы длина первого фрагмента пути составляла всего несколько символов. Обязательное условие - папка должна находиться в общей папке (которая может уже быть, если она находится на сервере, где я должен был это сделать), и если ее еще нет, выберите папку где-нибудь в пути и поделиться этим. В зависимости от среды и уровня паранойи, разрешите всем изменять доступ к общему ресурсу, если разрешения NTFS достаточно ограничены. Если хотите, просто разрешите изменять права только для своей учетной записи.

Теперь перейдите в общую папку или папку внутри нее и поделитесь ею или используйте командную строку следующим образом. Предположим, что вы использовали общую папку «foo» как «fooshare», тогда вы можете сделать

net use x: \\mycomputername\fooshare\bar\folders /persistent:no 

и диск X: теперь указывает непосредственно на папку «папки» внутри этого общего ресурса, поэтому «x: \ oldfiles \ myoldfile.txt» теперь довольно короткий.

(«/ Persistent: no» означает, что это не переживет следующую перезагрузку и не запутает вас в дальнейшем. Не забудьте отключить общий доступ к своей папке, когда закончите.)

Помните, что вы не должны делить папку, содержащую файл обязательно, если это уже внутри общей папки вы можете просто карту через акцию и вложенные папки в целевой папку рядом с файлом, и работает отлично.

Мне пришлось использовать эту технику, чтобы выполнить массовую робокопию между двумя серверами, когда мы поняли, что пользователи подключили диски достаточно глубоко в структуре папок, поэтому они смогли использовать оттуда 255 символов, но это превысило общую длину пути к файлу при доступе с локального диска root.

вы можете избежать совместного использования, используя `subst x: C: \ Some \ first \ part \ of \ the \ long \ path`, а затем удалите диск с помощью` subst x: / d` mihi 10 лет назад 4
Хорошая попытка, но когда у вас есть 10 вложенных папок, это невозможно. Julian Knight 9 лет назад 1
Трюк "subst", кажется, работает хорошо, если имя файла не такое * длинное, чтобы его длина превышала 260 символов даже в корне диска. Stephen Chung 8 лет назад 0
Вам также не нужно явно предоставлять общий доступ к какой-либо папке с помощью `net use`, вы можете использовать общие ресурсы администратора по умолчанию:` net use x: \\ localhost \ c $ \ bar \ folder / persistent: no` kapex 7 лет назад 0
9
Col

Самый простой способ, который я нашел, - это загрузиться с живого CD с Ubuntu.

В качестве альтернативы вы можете создать общую папку на полпути по пути, а затем подключить к ней сетевой диск и выполнить удаление из сопоставленной папки (даже на той же машине)

Забавно, как часто Ubuntu Live CD помогает устранять проблемы с Windows ^^ Ivo Flipse 15 лет назад 16
Я заметил, что сам, изворотливая сеть пробует живой CD, проблема с файловой системой пробует живой CD, поврежденная таблица разделов и т. Д. И т. Д. :-) Col 15 лет назад 1
Это единственное решение, которое сработало для меня. Я люблю тебя, Linux! <3 David Frye 10 лет назад 0
Запустите bash из windows. Linux не требуется. ;-) Кроме того, если вы работаете в Windows 10, просто установите «Windows Subsystem for Linux», в основном Windows использует Ubuntu API-хуки для выполнения работы ... утилиты, включая «apt, ssh, rsync, find, grep, awk, sed, sort, xargs, md5sum, gpg, curl, wget, apache, mysql, python, perl, ruby, php, gcc, tar, vim, emacs, diff, patch и большинство десятков тысяч двоичных пакетов в архивах Ubuntu! «Это очень полная среда разработки Linux, которая, как оказалось, работает на Windows. Http://www.zdnet.com/article/ubuntu-and-bash-arrive-on-windows-10/ Dawesi 8 лет назад 1
Cygwin - это еще одна альтернатива для запуска команд LINUX в ​​Windows. atom88 7 лет назад 0
5
Rook

Переименуйте каталог вырезать / вставить файл в другом месте, а затем удалите его. Работает здесь.

Или просто из командной строки, если вы не хотите проходить через проблему.

Это работает как шарм. Копайте там (для меня это были супер вложенные папки `node_modules`), перетаскивайте его на рабочий стол и удаляйте. Промойте и повторите, поднимаясь по нескольким папкам за раз. Что за неприятная проблема. nickb 9 лет назад 0
Это не сработало для меня - операция вставки не удалась из-за длинного имени файла - не имеет значения, где ее вырезать. UpTheCreek 8 лет назад 6
1
William Hilsum

Наверное, не лучший способ, и мне интересно посмотреть, что придут другие -

У меня было это однажды, и я попробовал несколько вещей без какой-либо удачи. Вместо того, чтобы искать хороший инструмент, я перезапустил диск с Windows, пошел к консоли восстановления и просто удалил ее оттуда. Работал первый раз и действительно хорошо!

Кроме того, только что сделал Google для вас и нашел это - DelinvFile выглядит хорошо, но не могу ручаться за это.

Редактировать - Предупреждение, только что увиденное выше - всего лишь пробная версия - Может быть, не так хорошо, как я думал!

Бесплатный rimraf работает просто отлично и работал, когда все остальные идеи провалились. Требуется node.js Julian Knight 9 лет назад 0