У Windows 7, як знайти всі мої файли, для яких імена файлів занадто довгі


5

Dropbox говорить, що багато моїх файлів не синхронізуються, оскільки їхня назва перевищує максимальну довжину символу

https://www.dropbox.com/help/145/ua

Максимальна довжина символу

Windows дозволяє використовувати лише імена файлів і папок довжиною в 260 символів.   Зауважте, що Windows вважає шлях до файлу частиною імені файлу   як C: Користувачі Panda Мої документи Dropbox Creative Nonfiction My   Автобіографія Улюблені речі Улюблені продукти Бамбук Сім'я   Рецепти Свіжі Листи.doc становитимуть 142 символи, а не 16. Якщо   Повний шлях і ім'я файлу перевищують 260 символів, скорочують ім'я або   перемістіть файл або папку до папки більш високого рівня у вашій Dropbox.

Як знайти всі файли в каталозі, у яких імена файлів і папок перевищують 250 символів?

(Примітка. Інструмент "Перевірити неправильні файли" на цій сторінці також не знайдено.)

Оновлення: до цих пір є дві пропозиції, одна з яких за допомогою Powershell іронічно загинула, коли ім'я файлу стало занадто великим, а інше - за допомогою cygwin і xargs, що може працювати, але все ще працює (через кілька хвилин).

Я вирішив свою безпосередню проблему.

У вікні оболонки emacs я запустив дуже просту знахідку

$ find . -type f -print >> ../files.log

Потім я відкрив у emacs і набрав m-x list-matching-lines ^ ESC 230 . RETURN

Який відображає рядки, що відповідають регулярному виразу, і регулярний вираз тут полягає в тому, що рядок містить не менше 230 символів, де 230 - це лише груба думка для рядків, які можуть бути проблематичними. І це показало мені два файли, які були занадто довгими.

Для близько 20000 файлів, фільтр регулярних виразів виявився майже миттєвим.


Відповіді:


4

Якщо у вас встановлено Cygwin, я думаю, що це має працювати:

find /cygdrive/c/Users/username/Dropbox -type f -print0 | xargs -0 -I {} bash -c 'if [[ $(echo -n "{}" | wc -c) -gt "269" ]]; then echo "{}"; fi'

Вибачте, що я не знаю рідного способу зробити те ж саме.


Я cygwin, так спасибі. Я думаю, що було б приємно знати, чи існує стандартний спосіб для цього, оскільки вікна дозволяють вам створювати ці файли, але не дозволяють легко їх виявити!
Jerry Asher

Я спробував це, і насправді, через кілька хвилин він все ще працює (taskmgr підтверджує, що xargs працює біт), і поки що він виплюнув $ find . -type f -print0 | xargs -0 -I {} bash -c 'if [[ $(echo -n "{}" | wc -c) -gt "255" ]]; then echo "{}"; fi' bash: -c: line 0: unexpected EOF while looking for matching ) 'bash: -c: line 1: несподіваний маркер ÿ' in conditional command bash: -c: line 1: syntax error: unexpected end of file
Jerry Asher

1
Ще одне оновлення. Я підозрюю, що знайти з cygwin б працював нормально. Виявилося, що знайти в моїй PATH виходила з рідної GIT установки.
Jerry Asher

2

Відкрийте консоль Powershell: Get-ChildItem -r * |? {$_.GetType().Name -match "File" } |? {$_.fullname.length -ge 260} |%{$_.fullname}

Кредит на @rerun, який опублікував це у переповненні стека. https://stackoverflow.com/q/12697259/614863


Цікаво, дякую. Я також спробую це зробити.
Jerry Asher

2
За іронією долі, викладене вище Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. At line:1 char:1 + Get-ChildItem -r * |? {$_.GetType().Name -match "File" } |? {$_.fullname.length ... + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : ReadError: (C:\Users\jerry\...\blogs\markdown:String) [Get-ChildItem], PathTooLongException + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand
Jerry Asher

1

Хм - find | xargs | bash - виклик одного bash-процесу (edit: oops - пропущено xargs, вибачте, pls ігнорувати решту цього абзацу :), щоб рахувати тільки довжину одного рядка, здається, трохи 'процес важкий'. Буде стільки викликів bash, скільки файлів, може бути a багато ...

find | awk буде мати один процес з кожної сторони (тобто: лише 2 процеси)

Спробуйте це (для чого повинен бути набагато швидше результат [редагувати: можливо, не так з xargs ]):

find . -type f | awk 'length > 259' > longfilename-list.txt

Припущення: може бути ОС залежною, YMMV

  • find за промовчанням друкуватиме відповідність, тому не потрібно -print0.
  • print $0 (відповідний рядок) є дією за умовчанням у awk, так ні {print} необхідне після порівняння.

-print0 важливо, якщо імена файлів можуть містити нові рядки. Крім того для xargs це також надзвичайно важливо для імен файлів, що містять інші пробіли, лапки та зворотні коси. Всі ці параметри за замовчуванням розділяються і для спеціальних символів xargs! ------ Ваш код з awk добре, за винятком імен файлів, що містять нові рядки, які, ймовірно, не дозволено у Windows. ------ Код може бути ще коротшим. . за умовчанням. Потрібно перевіряти і довжини порожніх імен каталогу: find | awk 'length > 259'
pabouk

Просто для уточнення "." може буде типовим дещо нестандартні ОС. На FreeBSD 10.3: $ find -name "*.properties" -exec grep "^content.transformer" {} \; find: illegal option -- n $ find . -name "*.properties" -exec grep "^content.transformer" {} \; content.transformer.default.timeoutMs=blah На сторінці man: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression] ... ясно, що шлях є ні необов'язково.
eCloud Business Solutions

Дякуємо за вашу увагу. Я не знаю, що. Також POSIX стверджує, що поведінка без a path параметр "не вказано": pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html
pabouk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.