Para filtrar os nomes de arquivos legíveis por humanos, você pode usar o nome% strong [:print:] .
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Pensando duas vezes, o requisito "legível por humanos" pode se referir ao conteúdo do arquivo, em vez de seu nome. Em outras palavras, você estaria procurando por arquivos texto . Isso é um pouco mais complicado. Como o @D_Bye sugeriu em um comentário, você deve usar o comando grep para determinar o tipo de conteúdo do arquivo. Mas não seria uma boa ideia executar file após um pipe, porque isso 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
Isto é brevemente como o file -part funciona:
- O predicado
fileexecuta-execpara cadash -c 'file -b $0 | grep -q text' FILENAMEque satisfaz todas as condições anteriores (tipo, tamanho, não executável). - Para cada um desses arquivos, um shell (
FILENAME) executa este script :sh, substituindofile -b $0 | grep -q textpelo nome do arquivo. - O programa
$0determina o tipo de conteúdo de cada arquivo e gera essas informações. A opçãofileimpede a impressão do nome de cada arquivo testado. -
-bfiltra a saída proveniente do programagrep, procurando por linhas contendo "texto" . (Veja por si mesmo como é a saída típica do comandofile.) - Mas
filenão produz o texto filtrado, porque tem a opçãogrep(silenciosa) fornecida. O que acontece, é apenas alterar o status de saída para-q(que representa "true" - o texto filtrado foi encontrado) ou 1 (significado "error" - o texto "text " não apareceu na saída de0). - O status de saída verdadeiro / falso proveniente de
fileé passado ainda mais porgrepparashe atua como o resultado final de todo o teste "find". - Caso o teste acima retorne true , o comando
-exec sh -c 'file $0 | grep -q text' {} \;é executado (isto é, o nome do arquivo testado é impresso).