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

202

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

user3048
источник
Как были созданы эти файлы?
Ник
Извините за незнание этой темы, но разве Windows не должна обрабатывать эти файлы? Разве то, что будет опубликовано Эддинсом, не должно быть сделано автоматически Windows (даже из проводника)?
Стефанос Каланцис
2
@ Mokubai- Повторяющийся вопрос должен быть помечен как дубликат этого, так как этот вопрос старше .
AStopher
1
@cybermonkey: И у него есть лучший ответ.
Эллеседил
Для дальнейших читателей метод 7zip с CTRL+DELETE - это самый простой метод, на мой взгляд ...
Кристиан Голлхардт

Ответы:

426

Если вы хотите полностью удалить каталог и он содержит длинные пути, robocopyОЧЕНЬ хорошо работает:

mkdir empty_dir
robocopy empty_dir the_dir_to_delete /mir
rmdir empty_dir
rmdir the_dir_to_delete

Это работает, потому что robocopy внутренне использует Unicode-совместимые версии функций Win32 с \\?\префиксом для путей к файлам ; эти функции имеют ограничение 2¹⁶1 (32 767) символов вместо 259.

Возможно, вам придется пройти через этот процесс более одного раза, чтобы избавиться от всех файлов.

Benoit
источник
1
Эффективно, когда в файловой системе нет краткого имени (8.3).
Антуан РОДРИГЕС
1
Это хорошо работало с моими упрямыми файлами кеша в Магазине Windows, которые отказывались удалять. Спасибо!
Самир
1
Я должен был добавить / очистить к линии robocopy, чтобы это работало, но после этого он
добился цели
3
Robocopy - вот что привело меня в этот беспорядок, но мне никогда не приходило в голову использовать Robocopy, чтобы вытащить меня из этого. Отличный ответ! Спасибо!
Джей Мишо
2
@SarahofGaia, мой плохой, это 2¹⁶ - 1 фактически
Бенуа
91

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

dir /X

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

del LONGF~1.txt
Уилл Эддинс
источник
1
Мне это нравится, это приятное боковое мышление.
полковник
Хотя я не могу гарантировать, что в этом случае это сработает, я несколько раз использовал его для удаления папок с недопустимыми символами в конце, которые невозможно удалить обычными средствами.
Уилл Эддинс
1
Это работает для файлов и папок в текущей директории, но если вы как - то удается найти себя в папку, путь к которой слишком долго, это не поможет. Например, я сейчас нахожусь в консоли по слишком длинному пути и не могу даже dirили cd ...
Бобсон
1
@ Бобсон Если вы не можете dirиспользовать pushdвместо этого. Это сработало для меня.
BadHorsie
4
Это не работает с Windows 10, отображаемое имя файла длинное
Loenix
53

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

joeqwerty
источник
7
Это было единственное, что сработало для меня. Все остальные трюки, приведенные здесь и на других форумах, подобные этому, не сработали.
Эндрю Арнотт
Было единственным предложением, которое работало достаточно странно.
Нестор Ледон
Это сработало для меня, ярлык, который помог мне, был mv * 1 && cd 1. Это не сработало, когда в каталоге находилось несколько файлов, но в тот момент, как rm -rf *правило, получалось.
Александр Varwijk
1
Не могу сделать это в Windows 10 ... переименовать выбрасывает ошибку «имя файла в длинные»
Dawesi
3
Это не только решило проблему для меня, но также объясняет, как я в конечном итоге решил проблему. Должно быть, у меня был путь, который был близок к пределу, а затем я переименовал родительскую папку (добавив что-то вроде «резервное копирование в ноябре 2016 года» к названию), в результате чего файлы в подпапках превысили ограничение. Приятно знать причину, а также решение, хотя я знаю, что это может произойти и другими способами, я думаю, что это распространенный способ, который происходит с людьми.
Eselk
13

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

\\. \ C: \ некоторый каталог \ другой каталог \ файл с длинным именем
grawity
источник
3
не работает в Windows 10
Dawesi
спасибо, cmd работал шарм с этим в Win7rm -rf \\directoryname
Филипп Прайд
13

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

так что у вас есть 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.

AdamV
источник
4
вы можете избежать обмена с помощью, subst x: C:\Some\first\part\of\the\long\pathа затем удалить диск с помощьюsubst x: /d
mihi
1
Хорошая попытка, но когда у вас есть 10 вложенных папок, это невозможно.
Джулиан Найт
substТрюк , кажется, работает хорошо, если имя файла не так долго, чтобы сделать его пойти более 260 символов , даже в корне диска.
Стивен Чунг
Вам также не нужно явно предоставлять общий net usenet use x: \\localhost\c$\bar\folders /persistent:no
доступ
9

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

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

седло
источник
17
Забавно, как часто Ubuntu Live CD помогает устранять проблемы с Windows ^^
Ivo Flipse,
1
Я заметил, что сам, изворотливая сеть пробует живой CD, проблема с файловой системой пробует живой CD, поврежденная таблица разделов и т. Д. И т. Д. :-)
Col
Это единственное решение, которое сработало для меня. Я люблю тебя, Linux! <3
Дэвид Фрай
1
Запустите 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. Zdnet.com/article/ubuntu-and-bash-arrive-on-windows-10
Dawesi
cygwin - еще одна альтернатива для запуска команд LINUX в ​​Windows
atom88
5

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

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

ладья
источник
Это работает как шарм. Копайте там (для меня это были вложенные node_modulesпапки), перетаскивайте его на рабочий стол и удаляйте. Промойте и повторите, поднимаясь по нескольким папкам за раз. Что за неприятная проблема.
15:19
7
Это не сработало для меня - операция вставки не удалась из-за длинного имени файла - не имеет значения, где его вырезать.
UpTheCreek
1

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

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

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

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

Уильям Хилсум
источник
Свободный Rimraf работает просто отлично и работал, когда все другие идеи потерпели неудачу. Требуется node.js
Джулиан Найт,