Как найти самое длинное имя файла

Содержание

  1. Как найти файлы с длинными именами в windows 7
  2. Описание проблемы длинных путей
  3. Методы снимающие ограничения на длину пути в Windows
  4. Нюансы длинных путей в приложениях
  5. Как в Windows 10 отключить ограничение на длину пути в 260 символов через политику
  6. Включение поддержки длинных путей через реестр
  7. Как в Windows 10 отключить ограничение на длину пути в 260 символов через PowerShell
  8. Как удалять, копировать, переносить файлы и папки при ошибке с длинными путями
  9. Как в Windows 10 отключить ограничение на длину пути в 260 символов через командную строку
  10. Обход ограничений длинных путей через 7zFM
  11. Как обойти ограничение длинных путей через символьную ссылку
  12. Как исправить проблему «Имя файла слишком длинное» в Windows
  13. Почему длина имени файла является проблемой в Windows?
  14. Настройка Windows 10 на обработку длинных путей к файлам
  15. Параметры для Windows 10 Home
  16. Параметры для Windows 10 Pro или Enterprise
  17. Как временно исправить проблему с файлами?
  18. Легкое Исправление
  19. Менее простые исправления
  20. Как найти имена файлов, чья длина превышает определённое значение
  21. Как найти файлы с самыми длинными именами
  22. Сортировка файлов по длине имени файла
  23. Выбираем длинный путь (или прощай MAX_PATH)
  24. Приложения Win API
  25. .Net Framework
  26. .Net Core
  27. Как включить поддержку длинных путей в Windows 10 (1607)

Как найти файлы с длинными именами в windows 7

long paths on windows 01

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов Pyatilistnik.org. В прошлый раз мы с вами разобрали возможности утилиты PING, рассмотрели как ее применять на практике. В сегодняшней публикации я вам покажу, как устраняется боль и печаль в операционных системах Windows, я говорю про длинные пути, в своей практике я очень часто встречал жалобы «Слишком длинный целевой путь» или «Слишком длинный конечный путь«, то же самое вы можете встретить и при удалении. Ниже я покажу, как выкручиваться из данной ситуации.

Описание проблемы длинных путей

Тем не менее, файловая система Windows по-прежнему накладывает некоторые ограничения, например, какие символы могут использоваться в именах файлов и общую длину путей. Некоторое время максимальная длина пути составляла 260 символов, но с появлением Windows 10, часть ограничений начала потихоньку уходить, например для приложений и появилась возможность отключить проверку MAX_PATH и использовать длинные пути без префикса \?.

Что интересно, значение в 260 символов обусловлено значением MAX_PATH Win32 API. У файловой системы NTFS максимальная длина пути ″немного″ больше и составляет 32767 символа. Для обхода ограничений Win32 API некоторые приложения используют формат UNC, указывая абсолютный путь с префиксом \?, например так:

Большинство людей может и не столкнуться с ней, а вот почти каждый системный администратор обязательно это увидит. Тут все дело в том, что в большинстве организаций есть свои сетевые файловые ресурсы, через которые пользователи производят обмен и работу с документами. В какой-то момент люди могут создать такой путь, который будет 258 или 260 символов, попытаются туда скопировать файл, а им выдастся ошибка:

long paths on windows 02

Тоже самое при копировании в папку, так же выскакивает «Слишком длинный целевой путь».

long paths on windows 03

Вот ошибка при извлечении архива в сетевую папку:

long paths on windows 04

Методы снимающие ограничения на длину пути в Windows

Нюансы длинных путей в приложениях

Есть один нюанс. Этот новый параметр (имеется ввиду та политика и ключ реестра) не обязательно будет работать со всеми существующими приложениями, но он будет работать с большинством. В частности, любые современные приложения должны работать нормально, как и все 64-битные приложения. Старые 32-разрядные приложения должны быть применимы для работы, что на самом деле просто означает, что разработчик указал в файле манифеста приложения, что приложение поддерживает более длинные пути. Большинство популярных 32-битных приложений не должно вызывать проблем. Тем не менее, вы ничем не рискуете, пробуя настройку. Если приложение не работает, единственное, что произойдет, это то, что оно не сможет открывать или сохранять файлы, сохраненные в местах, где полный путь превышает 260 символов.

Если вы разработчик, то чтобы ваше приложение имело возможность работать с длинными путями Windows, в манифесте обязательно указывайте следующие настройки:

Как в Windows 10 отключить ограничение на длину пути в 260 символов через политику

Чем примечателен данный метод, так это тем, что неподготовленных пользователей он не вынуждает выполнять команды или производить правку реестра, тут все в графическом виде. Так же если у вас есть домен Active Directory и вы хотите массово убрать ошибки «Слишком длинный целевой путь» или «Слишком длинный конечный путь» в приложениях и запретить им проверять MAX_PATH и использовать длинные пути без префикса \?, то групповые политики вам это помогут.

Покажу для начала, как делать через локальную политику, открываете окно «Выполнить» в котором пишите gpedit.msc.

long paths on windows 05

Далее идем по пути:

Найдите тут параметр «Включить длинные пути Win32 (Enable Win32 long paths)«, по умолчанию он отключен, и я честно не понимаю почему. Активируйте его.

long paths on windows 06

Как я писал выше, в проводнике это не даст ни каких эффектов, поэтому вы все так же будите получать ошибку при копировании, создании, удалении «Слишком длинный целевой путь» или «Слишком длинный конечный путь«. Ниже я покажу, что делать если нужно что-то там удалить или изменить. Данное ограничение в длине пути теперь не подхватиться на лету всеми приложениями, потребуется перезагрузка.

Включение поддержки длинных путей через реестр

Данный метод ни чуть не сложнее предыдущего и делает все то же самое, включает поддержку длинных путей свыше 256 символов для приложений Windows. Когда вы что-то меняете через редактор политик, по сути меняются настройки в реестре, это нужно помнить и знать. Сейчас я вам покажу какой ключ меняется. Откройте редактор реестра Windows. Перейдите в раздел:

тут вам необходимо найти параметр LongPathEnabled, которому для активации поддержки длинных путей и изменения ограничений в MAX_PATH, нужно задать значение «1». Тут потребуется перезагрузка.

long paths on windows 07

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

long paths on windows 09

Еще вы можете сделать такую поддержку и для конкретного пользователя по пути:

Если там нет ключа LongPathsEnabled, то создайте его, тип DWORD (32 бита) и значение 1.

Как в Windows 10 отключить ограничение на длину пути в 260 символов через PowerShell

Не все люди готовы копаться в редакторах и реестрах, им нужно быстрое решение, одним из таких является PowerShell. В оболочке выполните команду для активации параметра «Включить длинные пути Win32 (LongPathEnabled)». Не забываем перезагрузить систему.

long paths on windows 08

Как удалять, копировать, переносить файлы и папки при ошибке с длинными путями

Разобравшись с тем, как отключить проверку MAX_PATH в приложениях, давайте теперь поймем и научимся решать проблему длинных путей на файловых шарах и просто в проводнике. Классическая ситуация, когда пользователь попытался перенести свой файл или удалить его, создать папку и так далее, и он получает ошибку с пресловутыми длинными путями. Он просит разобраться вас и тут начинаются танцы с бубнами, вы просите его либо переименовать часть пути, или попросить его произвести действия в другом расположении, или просто забить, сказав, что виновата Windows со своими ограничениями, но мы же с вами профессионалы и инженеры, поэтому должны уметь выходить из таких ситуаций.

Как в Windows 10 отключить ограничение на длину пути в 260 символов через командную строку

Запустите командную строку в режиме администратора и введите:

long paths on windows 23

Обход ограничений длинных путей через 7zFM

Наверняка многие знают архиватор 7Zip, но мало кто пользуется его файловым менеджером 7zFM.exe, а зря именно он может вам помочь в ситуации с сообщением «Слишком длинный целевой путь» или «Слишком длинный конечный путь». Вот у меня есть тестовая директория, у которой уже есть 260 символов в пути, и я не могу там создавать новую папку.

long paths on windows 10

Откройте 7zFM.exe и перейдите в нем в конечную папку вашего пути.

Для создания новой папки нажмите клавишу F7.

long paths on windows 11

Задайте необходимое вам имя, в моем примере это будет «БОльше 260 Microsot«.

long paths on windows 12

В результате у нас создалась новая папка и заметьте 7zFM не ругнулся на наличие длинных путей, он их игнорирует просто и все.

long paths on windows 13

Проверяем, что директория доступна через проводник Windows.

long paths on windows 14

Все прекрасно отображается. Теперь я думаю вы легко сможете переносить, копировать, удалять файлы через 7zFM, когда вам проводник Windows ругается на наличие длинных путей.

long paths on windows 15

Как обойти ограничение длинных путей через символьную ссылку

Такой трюк мы с вами уже проделывали, когда нужно было переносить IMAP профиль у Outlook. Смысл в том, что создается файл в нужном вам месте, и этот файл это просто ярлык ссылающийся на нужный вам файл или папку, после этого путь сокращается и вы можете удалять или создавать все что вам нужно. Откройте командную строку, далее вам нужно иметь два составляющих:

long paths on windows 16

Нам поможет команда mklink, где ключ /D создает ссылку на каталог

Источник

Как исправить проблему «Имя файла слишком длинное» в Windows

keyboard 469548 640.jpg.optimal

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

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

Почему длина имени файла является проблемой в Windows?

Существует большая история длины файлов, что является проблемой для операционных систем, таких как Windows. Было время, когда вы не могли иметь имена файлов длиннее 8 символов плюс 3-символьное расширение файла. Лучшее, что вы могли сделать, это что-то вроде myresume.doc. Это было ограничение в отношении дизайна файловой системы.

Все стало лучше, когда вышли новые версии Windows. Мы перешли от старой ограниченной файловой системы к так называемой файловой системе новой технологии (NTFS). NTFS привела нас к тому, что имя файла может быть длиной 255 символов, а длина пути к файлу потенциально может достигать 32 767 символов. Так как же мы можем иметь слишком длинные имена файлов?

despaired 2261021 640.jpg.optimal

В Windows есть вещи, известные как системные переменные. Это переменные, от которых зависит функционирование Windows, потому что Windows всегда будет знать, что означают переменные и где они находятся, даже когда мы перемещаем биты и байты повсюду. Системная переменная MAX_PATH — это та, которая ограничивает имена файлов и пути к файлам до 260 символов.

Будучи переменной, вы думаете, мы могли бы изменить это. Нет, мы не должны. Это все равно что выдернуть нитку из свитера. Как только одна системная переменная изменяется, другие системные переменные и зависимые от них компоненты начинают распадаться.

Настройка Windows 10 на обработку длинных путей к файлам

Если вы знаете, что будете часто использовать длинные пути к файлам и длинные имена файлов, вам будет проще заставить Windows работать. Нет смысла использовать PowerShell для выполнения работы каждый день.

Есть два способа сделать это. Один предназначен для пользователей Windows 10 Home, а другой — для пользователей Windows 10 Pro или Enterprise. Эти методы могут работать для Windows 8.1 или более ранней версии, но мы не можем гарантировать это.

Параметры для Windows 10 Home

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

Открыв редактор реестра и сделав резервную копию, перейдите в папку HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem и найдите ключ LongPathsEnabled.

regedit long path enabled

Дважды щелкните LongPathsEnabled. Убедитесь, что в поле Значение данные: номер 1 указан. Нажмите OK, чтобы подтвердить изменения.

regedit long path enabled change value

Выйдите из редактора реестра, и теперь вы сможете работать с безумными длинными путями к файлам.

Параметры для Windows 10 Pro или Enterprise

Чтобы позволить Windows 10 Pro или Enterprise использовать длинные пути к файлам, мы будем использовать редактор локальной групповой политики. Это инструмент, который позволяет нам устанавливать политики в отношении работы Windows на компьютере и на уровне пользователей.

open group policy editor

После открытия редактора групповой политики перейдите к Конфигурация компьютера → Административные шаблоны → Система → Файловая система. Там вы увидите политику включения длинных путей Win32.

group policy enable long filenames

Дважды щелкните по нему, чтобы изменить параметр политики. Измените его с «Отключено» на «Включено», затем нажмите кнопку «ОК», чтобы зафиксировать изменение.

group policy enable Win32 long paths enabled

Политика может не вступить в силу сразу. Вы можете принудительно обновить групповую политику.

Как временно исправить проблему с файлами?

Легкое Исправление

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

Понятно, кто в этом случае виновник. Найдите файл в проводнике Windows или в проводнике, как он называется в Windows 10, нажмите один раз на него, нажмите F2, чтобы переименовать его, и измените это глупое имя файла на более разумное. Задача решена.

Менее простые исправления

Не всегда легко решить эту проблему. Иногда вы не можете изменить имена файлов или каталогов по любой причине.

Следующие решения помогут вам. Их несложно сделать.

Перемещение, удаление или копирование файлов или каталогов с помощью PowerShell
Иногда вы получаете сообщение об ошибке при попытке переместить, удалить или скопировать каталоги, где количество символов для пути к файлу превышает 260.

Обратите внимание, что слова каталог и папка являются взаимозаменяемыми. Мы будем использовать «каталог» в будущем. Следующие командлеты PowerShell также можно использовать для файлов.

Возможно, путь к файлу выглядит примерно так:

Этот путь к файлу составляет 280 символов. Поэтому мы не можем скопировать каталог оттуда куда-либо еще с помощью обычного метода копирования-вставки. Мы получаем ошибку Destination Path Too Long.

file explorer destination path too long error

Давайте предположим, что по какой-то причине мы не можем переименовать каталоги, в которые вложен файл. Что мы делаем?

Когда откроется PowerShell, вы окажетесь в корне своего пользовательского каталога. Продолжайте, предполагая, что C:Usersguymc — ваш пользовательский каталог.

powershell cd documents

Вы увидите быстрое изменение текущего каталога на C:UsersguymcDocuments. Это хорошо. Мы работаем ближе к каталогам, которые облегчат жизнь.

Копирование каталога с использованием Copy-Item

Мы хотим скопировать каталог This и его содержимое в ThatNewFolder. Давайте используем команду PowerShell Copy-Item с параметрами -Destination и -Recurse.

-Destination сообщает PowerShell, где мы хотим, чтобы копия находилась. -Recurse говорит PowerShell скопировать все элементы внутри к месту назначения. Копирование оставляет оригиналы там, где они есть, и делает все новые в месте назначения.

powershell copy item

Переместить каталог с помощью Move-Item

Допустим, мы хотим переместить каталог This, а также все каталоги и файлы в нем, в ThatNewFolder. Перемещение не оставляет оригинал на месте.

Мы можем использовать команду PowerShell Move-Item с параметрами -Path и -Destination. -Path определяет элемент, который мы хотим переместить, и -Destination сообщает PowerShell, где мы хотим его получить.

Команда поместит это в ThatNewFolder. Он также будет перемещать все, что находится внутри этого каталога. Move-Item может использоваться для перемещения файлов или каталогов, и он работает независимо от пути к файлу или длины имени файла.

powershell move item

powershell this in thatnewfolder

Удалить каталог с помощью Remove-Item

Если мы хотим удалить этот каталог и все в нем, мы используем команду Remove-Item.

Командлет Remove-Item обладает некоторой встроенной безопасностью, которая затрудняет удаление каталога с содержимым внутри него. В нашем примере мы знаем, что хотим удалить все, поэтому мы будем использовать параметры -Recurse, чтобы заставить его удалять все внутри, и -Force, чтобы он делал это, не спрашивая нас, уверены ли мы в каждом элементе внутри.

Имейте в виду! Восстановить что-либо удаленное таким образом было бы чрезвычайно сложно.

powershell remove item

Вы можете снова использовать команду dir, чтобы убедиться, что она пропала.

Вот и все

Существуют и другие способы обхода длинных имен файлов и путей к файлам, но то, что мы здесь рассмотрели, — это самые простые и эффективные методы.

Источник

Как найти имена файлов, чья длина превышает определённое значение

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

Если имена файлов слишком длинные для данной файловой системы, то могут возникнуть ошибки разного рода: отказ программы записать файлы на DVD диск, либо Windows приложения не будут видеть часть файлов, которые расположены в папке с файлом, имеющим слишком длинное название.

Один из вариантов исправить ситуацию — найти файлы с длинными именами и переименовать их или удалить.

Как найти файлы с самыми длинными именами

Следующая команда ищет имена файлов в текущей директории, чья длина более 255 символов (в число 257 включены начальные ./):

В этой команде можно явно указать путь до директории, в которой нужно выполнить поиск:

Вы можете изменить размер имени для поиска:

Пример выполнения команды:

find long filenames

Сортировка файлов по длине имени файла

Кроме поиска имён файлов, длина которых больше определённого размера, можно вывести на экран имена всех файлов, отсортированных по количеству символов в имени и с указанием их размера. Для этого можно использовать такую команду:

Пример работы программы:

long filenames

Ещё один вариант программы, которая делает это же самое, но для который не требуется PERL:

long filenames 2

Как можно увидеть, хотя обе команды выполняют свою функции, методы подсчёта различаются и результаты тоже чуть различаются — вы можете выбрать ту из них, которая вам больше нравится.

Источник

Выбираем длинный путь (или прощай MAX_PATH)

783f45e7912346fba386a1707fcee1dd

Многим пользователям ПК под управлением ОС Windows, не говоря о разработчиках, знакомы проблемы при работе с длинными (более 260 символов, MAX_PATH) путями файлов или каталогов.

Приложения Win API

В приложениях, которые используют Win API для работы с файлами, рецепт избавления от ограничения MAX_PATH был известен с незапамятных времён – необходимо было использовать Unicode версию функции с окончанием «W» для работы с директорией или файлом и начинать путь с префикса \?. Это давало возможность использовать пути длинной до 32767 символов.

В Windows 10 (1607) поведение функций для работы с файлами изменилось: появилась возможность отключить проверку ограничений MAX_PATH на уровне системы.

Это избавляет от необходимости использовать префикса \? и потенциально даёт шанс приложениям, работающим напрямую или косвенно через Win API, получить поддержку длинных путей без необходимости их пересборки. Как активировать эту возможность описано в конце статьи.

.Net Framework

.Net Core

Тут поддержку длинных путей анонсировали ещё в ноябре 2015 года. Видимо сказалось Open Source природа проекта и отсутствие строгой необходимости обеспечения обратной совместимости.

Вот тут можно посмотреть пример.

Как включить поддержку длинных путей в Windows 10 (1607)

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

Включить встроенную поддержку длинных путей можно создав или изменив следующий параметр системного реестра: HKLMSYSTEMCurrentControlSetControlFileSystem Параметр LongPathsEnabled (Тип: REG_DWORD) 1 – соответствует значению включено.

c443ebc1569b4eff8d7813c91d2a31e1

Или через групповые политики (Win+Rgpedit.msc) Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long paths.Оно же в локализованном варианте: Конфигурация компьютера > Административные шаблоны > Система > Файловая система > Включить длинные пути Win32.

dad098a0aee447ef85ac8809f654597b

Далее источники расходятся во мнении относительно манифеста (или я неправильно понял, но на данный момент проверить не имею возможности). Например, в документации MSDN написано, что манифест можно использовать в качестве альтернативного способа активации поддержки длинных путей в отдельных приложениях, а в блоге MSDN указано, что это является вторым обязательным шагом после активации в политиках.
Но они сходятся в формате задания данной опции:

С CMD, к сожалению, это не сработает, на данный момент, из-за особенностей работы с путями, а в PowerShell должно всё заработать.

На этом мой небольшой пятничный пост заканчивается, оставив за рамками вопросы полноты реализации поддержки длинных путей в Windows 10 (1607), или работоспособность при использовании различных комбинаций редакций Windows, файловых систем и API. По мере поступления новых фактов и результатов экспериментов пост будет обновляться.

Источник

0 / 0 / 0

Регистрация: 21.03.2013

Сообщений: 48

1

Как в каталоге найти файл с самым длинным именем?

21.03.2013, 23:56. Показов 3598. Ответов 5


Студворк — интернет-сервис помощи студентам

Помогите пожалуйста написать скрипт, который будет искать в любом(текущем, домашнем, корневом) каталоге файл с самым длинным именем. Мало опыта в среде shell, есть мысли только как их синтаксически правильно изложить, не знаю.
-exec wc – c это примерное начало, дальше проблемы с basename, с помощью которого нужно посчитать количество символов в имени файла, ну и конец совсем простой, сортируем все это дело по количеству символов по убыванию и выбираем самый верхний. Проблема в середине с подсчетом количества символов. Может подскажете идею



0



kpp

38 / 38 / 3

Регистрация: 28.01.2013

Сообщений: 123

22.03.2013, 00:12

2

Bash
1
2
3
4
5
#!/bin/sh
 
path="${1}"
 
find "${path}" -print | awk -F/ '{print length($NF)" "$NF}' | sort -k1,1nr | head -10

Выводит 10 самых длинных имен файлов.



0



0 / 0 / 0

Регистрация: 21.03.2013

Сообщений: 48

22.03.2013, 01:28

 [ТС]

3

спасибо за помощь, есть пару вопросов, чтобы лучше понять эту систему, она новая для меня, помогите пожалуйста:
1) #!/bin/sh что такое sh, раньше писал скрипты только на bin/bash
2) для чего нужна переменная awk и что делает ‘{print length($NF)” “$NF}’
3) можно ли этот скрипт реализовать через basename, просто интересно как пользоваться этой командой?



0



accept

4865 / 3287 / 468

Регистрация: 10.12.2008

Сообщений: 10,570

22.03.2013, 01:32

4

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func()
{
    local maxfname="" maxlen=0
    local IFS=$'n'
    
    for fname in $(find "$1" -maxdepth 1 
                             -type f 
                             -printf "%fn"); do
        [ ${#fname} -gt $maxlen ] && {
            maxfname="$fname"
            maxlen=${#fname}
        }
    done
    echo "$maxfname"
}

пример

Код

[guest@localhost ~]$ func()
> {
>     local maxfname="" maxlen=0
>     local IFS=$'n'
>     
>     for fname in $(find "$1" -maxdepth 1 
>                              -type f 
>                              -printf "%fn"); do
>         [ ${#fname} -gt $maxlen ] && {
>             maxfname="$fname"
>             maxlen=${#fname}
>         }
>     done
>     echo "$maxfname"
> }
[guest@localhost ~]$ func /etc
DIR_COLORS.lightbgcolor
[guest@localhost ~]$ func .
.git-completion.bash
[guest@localhost ~]$



0



38 / 38 / 3

Регистрация: 28.01.2013

Сообщений: 123

22.03.2013, 12:17

5

Цитата
Сообщение от gerrard89torres
Посмотреть сообщение

1) #!/bin/sh что такое sh, раньше писал скрипты только на bin/bash
2) для чего нужна переменная awk и что делает ‘{print length($NF)” “$NF}’
3) можно ли этот скрипт реализовать через basename, просто интересно как пользоваться этой командой?

1. /bin/sh – командный интертпретатор, кот. по умолчанию есть во всех *NIX системах.
/bin/bash – это тоже командный интертпретатор, с дополнительными встроенными возможностями.
Существует еще много разных вариантов интерпретаторов.
Все что написано под sh будет гарантировано работать под bash.
2. awk – это не переменная а мощная утилита по обработке текста.
Почитайте о ней. Информации много.
‘{print length($NF)” “$NF}’ – скрипт для awk: вывести длину последнего поля строки, пробел, содержимое последнего поля строки.
3. Любую задачу можно решить несколькими способами.
Можно через basename, однако прийдется использовать явный цикл, который работает заметно дольше.



0



0 / 0 / 0

Регистрация: 21.03.2013

Сообщений: 48

22.03.2013, 17:01

 [ТС]

6

Спасибо большое, хоть стало немного понятнее, более менее разобрался!



0



I’m using a xcopy in an XP windows script to recursively copy a directory. I keep getting an ‘Insufficient Memory’ error, which I understand is because a file I’m trying to copy has too long a path. I can easily reduce the path length, but unfortunately I can’t work out which files are violating the path length restriction. The files that are copied are printed to the standard output (which I’m redirecting to a log file), but the error message is printed to the terminal, so I can’t even work out approximately which directory the error is being given for.

asked Oct 2, 2012 at 19:51

WestHamster's user avatar

1

do a dir /s /b > out.txt and then add a guide at position 260

In powershell cmd /c dir /s /b |? {$_.length -gt 260}

answered Oct 2, 2012 at 20:08

rerun's user avatar

rerunrerun

24.9k6 gold badges47 silver badges78 bronze badges

9

I created the Path Length Checker tool for this purpose, which is a nice, free GUI app that you can use to see the path lengths of all files and directories in a given directory.

I’ve also written and blogged about a simple PowerShell script for getting file and directory lengths. It will output the length and path to a file, and optionally write it to the console as well. It doesn’t limit to displaying files that are only over a certain length (an easy modification to make), but displays them descending by length, so it’s still super easy to see which paths are over your threshold. Here it is:

$pathToScan = "C:Some Folder"  # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:tempPathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.

$writeToConsoleAsWell = $true   # Writing to the console will be much slower.
 
# Open a new file stream (nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
    $filePath = $_.FullName
    $length = $_.FullNameLength
    $string = "$length : $filePath"
     
    # Write to the Console.
    if ($writeToConsoleAsWell) { Write-Host $string }
  
    #Write to the file.
    $stream.WriteLine($string)
}
$stream.Close()

SimplyInk's user avatar

SimplyInk

5,5641 gold badge18 silver badges27 bronze badges

answered Oct 24, 2013 at 23:39

deadlydog's user avatar

deadlydogdeadlydog

22.1k14 gold badges108 silver badges117 bronze badges

5

As a refinement of simplest solution, and if you can’t or don’t want to install Powershell, just run:

dir /s /b | sort /r /+261 > out.txt

or (faster):

dir /s /b | sort /r /+261 /o out.txt

And lines longer than 260 will get to the top of listing. Note that you must add 1 to SORT column parameter (/+n).

answered Feb 13, 2016 at 15:51

Chungalin's user avatar

ChungalinChungalin

4204 silver badges5 bronze badges

5

I’ve made an alternative to the other good answers on here that uses PowerShell, but mine also saves the list to a file. Will share it here in case anyone else needs wants something like that.

Warning: Code overwrites “longfilepath.txt” in the current working directory. I know it’s unlikely you’d have one already, but just in case!

Purposely wanted it in a single line:

Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}

Detailed instructions:

  1. Run PowerShell
  2. Traverse to the directory you want to check for filepath lengths (C: works)
  3. Copy and paste the code [Right click to paste in PowerShell, or Alt + Space > E > P]
  4. Wait until it’s done and then view the file: cat longfilepath.txt | sort

Explanation:

Out-File longfilepath.txt ; – Create (or overwrite) a blank file titled ‘longfilepath.txt’. Semi-colon to separate commands.

cmd /c "dir /b /s /a" | – Run dir command on PowerShell, /a to show all files including hidden files. | to pipe.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} – For each line (denoted as $_), if the length is greater than 250, append that line to the file.

answered Apr 2, 2016 at 21:58

Rani Kheir's user avatar

Rani KheirRani Kheir

1,03912 silver badges14 bronze badges

From http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/:

Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied

the first part just iterates through this and sub-folders; using -ErrorVariable AccessDenied means push the offending items into the powershell variable AccessDenied.

You can then scan through the variable like so

$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }

If you don’t care about these files (may be applicable in some cases), simply drop the -ErrorVariable AccessDenied part.

answered Jul 20, 2015 at 7:25

Jonno's user avatar

JonnoJonno

1,9762 gold badges21 silver badges21 bronze badges

1

you can redirect stderr.

more explanation here, but having a command like:

MyCommand >log.txt 2>errors.txt

should grab the data you are looking for.

Also, as a trick, Windows bypasses that limitation if the path is prefixed with \? (msdn)

Another trick if you have a root or destination that starts with a long path, perhaps SUBST will help:

SUBST Q: "C:Documents and SettingsMyLoginNameMy DocumentsMyStuffToBeCopied"
Xcopy Q: "d:Where it needs to go" /s /e
SUBST Q: /D

answered Oct 3, 2012 at 14:41

SeanC's user avatar

SeanCSeanC

15.6k5 gold badges45 silver badges65 bronze badges

5

Crazily, this question is still relevant. None of the answers gave me quite what I wanted although E235 gave me the base. I also print out the length of the name to make it easier to see how many characters one has to trim.

Get-ChildItem -Recurse | Where-Object {$_.FullName.Length -gt 260} | %{"{0} : {1}" -f $_.fullname.Length,$_.fullname }

answered Nov 15, 2021 at 15:43

housten's user avatar

For paths greater than 260:
you can use:

Get-ChildItem | Where-Object {$_.FullName.Length -gt 260}

Example on 14 chars:
To view the paths lengths:

Get-ChildItem | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}

Get paths greater than 14:

Get-ChildItem | Where-Object {$_.FullName.Length -gt 14}  

Screenshot:
enter image description here

For filenames greater than 10:

Get-ChildItem | Where-Object {$_.PSChildName.Length -gt 10}

Screenshot:
enter image description here

answered Mar 7, 2015 at 11:05

E235's user avatar

E235E235

11.1k22 gold badges89 silver badges139 bronze badges

0

Я помогаю своему дяде перенести все его фотографии с внутренних и внешних жестких дисков машин Windows на его недавно купленный NAS, и мы натолкнулись на небольшую проблему (с «только» 3000 файлами …), которая называется «Имя файла / папка». имя слишком длинное для копирования ». Так.. Я ищу приложение, которое может найти все файлы с определенной длиной имени для меня.

Проводник Windows может выполнять поиск по имени, типу, размеру и т.д., Но, насколько я могу судить, он не может выполнять поиск по длине имени. Поэтому я ищу приложение, которое может это сделать.

Примечание. Это может быть команда подсказки, при условии, что результат может быть просто экспортирован.


Бонус! Также применимо в командной строке: изменение имени файла / папки из того же приложения! Тире, точки и пробелы на самом деле не нужны и могут привести к более коротким именам, таким образом, возможно, возможно передать!

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

Пример обхода ограничения на удаления файла с длиной пути более 260 символов будет приведен ниже, но, наверное, вам также будет интересно узнать, сколько таких длинных путей имеется в вашей системе.

Для этого мы предлагаем использовать простую утилиту Long Path Checker. Подобными возможностями обладает и PowerShell, но Long Path Checker предоставляет данные в более удобочитаемом виде.

Запустив утилиту, в поле «Starting Directory» указываем каталог или раздел, который будет служить точкой отсчёта и жмем «Get Path Lengths».

Long Path Checker

Менее чем через минуту программа выведет список всех имеющихся в системе путей от мала до велика, так что вам только останется отсортировать их по длине нажатием заголовка столбца «Length». Как видите, самый длинный путь, обнаруженный в нашей Windows, имеет 288 символов, а самый короткий — всего 6 символов. Полученные данные можно скопировать в буфера обмена, направленная вниз стрелка рядом с кнопкой копирования открывает меню сохранения данных в файл CSV. Если нажать по любому элементу ПКМ, появится меню перехода в содержащую папку файл, но эта опция не срабатывает, если длина пути превышает 260 символов.

Length

Обидно, что Long Path Checker не предлагает никаких практических решений для удаления объектов с длинными путями. Она просто констатирует факт, что такие пути в системе присутствуют.

Для удаления файлов со «сверхдлинными» путями можно использовать утилиту Long Path Fixer, но она не слишком удобна в обращении, так как путь к объекту приходится указывать, переходя по иерархической цепочке древа каталогов вручную.

Long Path Fixer

Long Path Fixer

Как открыть доступ к папке с длинным путем

Альтернативный вариант — создать на содержащий файл каталог с длинным путем симоволическую ссылку в командной строке командой:

mklink /d “D:link” “C:оченьдлинныйпутькпапке”

В результате в папке D:link у вас появится содержимое каталога с превышающим 260 символов путем, и вы сможете удалить находящиеся в нём файлы обычным образом.

Mklink

Удалить

Утилита для выявления длинных путей: github.com/deadlydog/PathLengthChecker

Утилита для удаления файлов с длинными путями: corz.org/windows/software/accessories/Long-Path-Fixer-for-Windows.php

Загрузка…

Добавить комментарий