Para filtrar os nomes de arquivos legíveis por humanos, você pode usar o nome da classe de caracteres[:print:] ( imprimível ) . Você encontrará mais sobre essas aulas no manual para .grep
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Pensando bem, o requisito "legível por humanos" pode se referir ao conteúdo do arquivo, em vez de seu nome. Em outras palavras, você procuraria por arquivos de texto . Isso é um pouco mais complicado. Como o @D_Bye sugeriu em um comentário, você deve usar o filecomando para determinar o tipo de conteúdo do arquivo. Mas não seria uma boa ideia correr fileatrás de um canal, porque complicaria a tarefa de exibir o nome do arquivo. Aqui está o que eu sugiro:
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
É assim que a fileparte-funciona:
- O
-execpredicado é executado sh -c 'file -b $0 | grep -q text' FILENAMEpara cada um FILENAMEque satisfaça todas as condições anteriores (tipo, tamanho, não executável).
- Para cada um desses arquivos, um shell (
sh) é executado este pequeno roteiro : file -b $0 | grep -q text, substituindo $0com o nome do arquivo.
- O
fileprograma determina o tipo de conteúdo de cada arquivo e gera essas informações. A -bopção impede a impressão do nome de cada arquivo testado.
grepfiltra a saída proveniente do fileprograma, procurando linhas contendo "texto" . (Veja você mesmo como é uma saída típica do filecomando.)
- Mas
grepnão gera o texto filtrado, porque ele tem a -qopção (silenciosa) fornecida. O que ele faz é apenas alterar seu status de saída para 0(que representa "true" - o texto filtrado foi encontrado) ou 1 (significando "error" - o texto "text" não apareceu na saída de file).
- O status de saída verdadeiro / falso proveniente
grepé passado adiante shpara finde age como o resultado final de todo o -exec sh -c 'file $0 | grep -q text' {} \;teste.
- Caso o teste acima retorne verdadeiro , o
-printcomando é executado (ou seja, o nome do arquivo testado é impresso).