5

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

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

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

Windows допускает только имена файлов и папок длиной не более 260 символов. Обратите внимание, что Windows считает путь к файлу как часть имени, поэтому такой файл, как C:\Users\Panda\ Мои документы \ Dropbox \ Creative Nonfiction \ Моя автобиография \ Любимые вещи \ Любимые продукты \ Бамбук \ Семейные рецепты \ Fresh Leaves.doc будет 142 символа, а не 16. Если полный путь к файлу и имя превышает 260 символов, сократите имя или переместите файл или папку в папку более высокого уровня в вашем Dropbox.

Как найти все файлы в каталоге, имена файлов и папок которого превышают 250 символов?

(Примечание: инструмент "Проверить плохие файлы" на этой странице также не находит их.)

Обновление: на данный момент есть два предложения: одно с использованием powershell, которое по иронии судьбы умерло, когда имя файла стало слишком большим, другое с использованием команды cygwin find и xargs, которая может работать, но все еще работает (несколько минут спустя).

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

В окне оболочки emacs я запустил очень простую находку

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

Затем я открыл это в emacs и набрал m-x list-matching-lines ^ ESC 230 . RETURN

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

Для примерно 20 000 файлов этот фильтр регулярных выражений оказался практически мгновенным.

3 ответа3

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'

Извините, что я не знаю родного способа сделать то же самое.

2

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

Благодарим @rerun, который разместил это в Stack Overflow. https://stackoverflow.com/q/12697259/614863

1

Хм - find | xargs | bash - вызов одного процесса bash (edit: oops - пропустил xargs , извините, пожалуйста , игнорируйте оставшуюся часть этого абзаца :), чтобы подсчитать только длину одной строки, кажется немного «тяжелым процессом». Будет столько же вызовов bash, сколько и файлов, может быть много...

find | awk будет выполнять по одному процессу на каждой стороне (т.е. только 2 процесса)

Попробуйте это (для получения более быстрого результата [edit: может быть, не так с xargs ]):

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

Допущения: может зависеть от ОС, YMMV

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .