Lista todos os arquivos e pastas que possuem um ponto de interrogação (?) em seu nome

0

Encontrei um problema de codificação ao copiar muitos arquivos e pastas de um sistema Windows para um do Linux e agora consigo ver muitos arquivos com ponto de interrogação em seu nome.

Gostaria de saber quantos arquivos / pastas foram afetados e tentei

find . -type d -o -type f -name '*\?*'

e

find . -type d -o -type f -name '*?*'

sem sorte.

Ele lista muitos arquivos / pastas que não possuem pontos de interrogação em seus nomes ... (observe que a pesquisa deve ser recursiva)

Você tem uma solução?

(Além disso, se você tiver um segundo comando para contar quantos arquivos são afetados, eu ficaria feliz :))

[edit] Obrigado por suas respostas, mas o problema parece ser que esses arquivos e pastas foram excluídos do comando find devido ao problema de codificação. Primeiro, parece que não é o? personagem, mas mais algo como . E eu tento executar a pesquisa em alguma outra parte do nome deles e eles ainda não aparecem (se eu renomeá-los, eu me livrei do problema de codificação, e eles ficam visíveis novamente para find ). a href="https://stackoverflow.com/a/9093719/6408940"> Isso me ajudou a listar e contar.

Obrigado

    
por Valentin Coudert 13.09.2018 / 12:12

3 respostas

1

Você tem um problema de codificação que deve ser resolvido.

O ? exibido por ls é um marcador e não significa que o arquivo tenha o nome ? .

Veja como reproduzir seu problema usando iconv , em um sistema Linux configurado utf8 usual:

$ mkdir /tmp/test
$ cd /tmp/test
$ touch $(echo é | iconv -t windows-1252) # that's the eacute character
$ ls
?
$ ls|cat
�

A última linha significa apenas que "a codificação utf8 inválida é exibida" e provavelmente não pode ser copiada / colada corretamente sem perder suas informações. windows-1252 é apenas um exemplo. Pode ter sido muitos outros (por exemplo: iso-8859-1 ). A informação ainda está lá:

$ ls|iconv -f windows-1252
é

Então, depois de descobrir qual codificação foi usada para gravar esses arquivos no Linux (tente iconv -l|egrep -i 'win|iso-8859' para uma possível lista de candidatos), você pode tentar renomear alguns lotes. Tenha cuidado enquanto um exemplo pode funcionar, pode falhar em outro arquivo.

Exemplo de renomeação:

ENCODING="windows-1252" # once the right encoding was found
for file in *; do
    dest="$(printf '%s' "$file" | iconv -f "$ENCODING")"
    mv -i "$file" "$dest.new"
    mv -i "$dest.new" "$dest"
done
    
por 15.09.2018 / 21:02
0

find ' -o significa " ou ", então você pode ter um problema com precedência ...

O que você quis dizer?

  • -type d ou ( -type f e -name '*\?*' )
    • todos os diretórios
    • todos os arquivos com ? em seu nome
  • ( -type d ou -type f ) e -name '*\?*'
    • apenas diretórios e arquivos com ? em seu nome

Você pode usar chaves com find , então seu comando se torna:

find . \( -type d -o -type f \) -name '*\?*'

Exemplo:

$ touch 'aaa' 'a?a'
$ mkdir 'bbb' 'b?b'
$ touch 'bbb/ccc' 'bbb/c?c'
$ find . -type d -o -type f -name '*\?*'
.
./bbb
./bbb/c?c
./b?b
./a?a
$ find . \( -type d -o -type f \) -name '*\?*'
./bbb/c?c
./b?b
./a?a

Você pode enviar a saída em wc -l para contar o número de linhas:

$ find . \( -type d -o -type f \) -name '*\?*' | wc -l
3

Outros estão sugerindo que você remova o -type d -o -type f . Essa é uma boa opção, a menos que você esteja tentando excluir outros tipos (por exemplo: bloquear dispositivo / caractere dispositivo / links simbólicos / canais / soquetes)

    
por 13.09.2018 / 13:52
0

Seu primeiro comando pode ser alterado da seguinte forma:

find . -type d  -name '*\?*' -o -type f -name '*\?*'

Dessa forma, o filtro se aplica a arquivos e diretórios (caso contrário, você listaria todos os diretórios e apenas os arquivos de filtro).

Muito mais simples, como sugerido por Jimmy_A nos comentários, seria:

find . -name '*\?*'

Observe que find procura por padrão no diretório atual, portanto, o . também pode ser omitido:

find -name '*\?*'

Como alternativa, você pode ver os resultados:

find | grep ?

Para contar as entidades relevantes (solução sugerida por Jimmy_A ):

find | grep ? | wc -l

command to count how many files are impacted

Para contar apenas arquivos como você parece estar perguntando:

find -type f | grep ? | wc -l

Execução de teste:

?aa
a?a
aa?
aaa
$ find | grep ?
./a?a
./?aa
./aa?

Comentário:

Eu achei que grep precisaria da opção -F para tratar ? literalmente, mas parece que não é considerado um caractere especial, a menos que a opção -E seja usada.

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings (instead of regular expressions), separated by newlines, any of which is to be matched.

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression (ERE, see below).

A questão foi atualizada:

List all files and folders which have a question mark (�) in their name

Não há muitas alterações: find -name '*�*' ou find | grep �

Execução de teste:

�aa
a�a
aa�
aaa
$ find -name '*�*'
./a�a
./�aa
./aa�

Outro problema ainda:

Se você quiser encontrar arquivos ou diretórios que contenham caracteres exóticos, poderá filtrar os resultados especificando quais caracteres você espera . Basta adicionar à lista qualquer caractere que você não queira destacar:

find | grep -P '[^\w./-_*]'

Isso é especialmente útil quando você não sabe qual é o caractere problemático. Por favor, note que esta é uma pergunta que já foi feita e respondida várias vezes no StackExchange.

    
por 13.09.2018 / 12:56

Tags