No Windows 7, como faço para encontrar todos os meus arquivos cujos nomes de arquivos são muito longos

5

O Dropbox informa que muitos dos meus arquivos não estão sendo sincronizados porque o nome deles excede o tamanho máximo do caractere

link

Max character length

Windows only allows file and folder names of 260 characters or less. Note that Windows counts the file path as part of the name, so a file like C:\Users\Panda\My Documents\Dropbox\Creative Nonfiction\My Autobiography\Favorite Things\Favorite Foods\Bamboo\Family Recipes\Fresh Leaves.doc would be 142 characters, not 16. If the entire file path and name exceed 260 characters, shorten the name or move the file or folder to a higher-level folder within your Dropbox.

Como faço para encontrar todos os arquivos em um diretório cujos nomes de arquivos e pastas são maiores que 250 caracteres?

(Nota: a ferramenta "Verificar arquivos defeituosos" nessa página também não os encontra.)

Atualização: há duas sugestões até agora, uma usando o powershell que ironicamente morreu quando um nome de arquivo cresceu muito, o outro usando find e xargs do cygwin, que podem funcionar, mas ainda está em execução (alguns minutos depois).

Eu resolvi meu problema imediato.

Em uma janela do shell do emacs, eu corri um achado muito simples

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

Então eu abri isso no emacs e digitei m-x list-matching-lines ^ ESC 230 . RETURN

O que exibe linhas que correspondem a uma expressão regular, e a expressão regular aqui é que a linha contém pelo menos 230 caracteres, em que 230 foi apenas um palpite para linhas que podem ser problemáticas. E isso me mostrou dois arquivos que eram muito longos.

Para cerca de 20.000 arquivos que o filtro de expressão regular acabou sendo quase instantâneo.

    
por Jerry Asher 20.09.2013 / 05:14

3 respostas

4

Se você tiver o cygwin instalado, acho que isso deve funcionar:

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

Desculpe por não saber da maneira nativa de fazer o mesmo.

    
por 20.09.2013 / 05:45
2

Abra o console do Powershell: Get-ChildItem -r * |? {$_.GetType().Name -match "File" } |? {$_.fullname.length -ge 260} |%{$_.fullname}

Crédito para @rerun que postou isso no Stack Overflow. link

    
por 20.09.2013 / 07:16
1

Hmm - find | xargs | bash - invocação de um processo bash único (edit: oops - perdeu o xargs , desculpe, pls ignorar o resto deste parágrafo :) para contar apenas o comprimento de uma linha, parece um pouco 'processo pesado'. Haverá tantas invocações como há arquivos, pode ser um lote ...

find | awk incorrerá em um processo de cada lado (ou seja, apenas dois processos)

Tente isso (para o que deve ser um resultado muito mais rápido [edit: talvez não com xargs ]):

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

Suposições: pode ser dependente do sistema operacional, YMMV

  • find será o padrão para imprimir a correspondência, portanto, não é necessário o print0.
  • print $0 (a linha correspondente) é a ação padrão em awk , portanto, não é necessário {print} após a comparação.
por 04.12.2013 / 07:07