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
file
executa-exec
para cadash -c 'file -b $0 | grep -q text' FILENAME
que 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 text
pelo nome do arquivo. - O programa
$0
determina o tipo de conteúdo de cada arquivo e gera essas informações. A opçãofile
impede a impressão do nome de cada arquivo testado. -
-b
filtra a saída proveniente do programagrep
, procurando por linhas contendo "texto" . (Veja por si mesmo como é a saída típica do comandofile
.) - Mas
file
nã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 porgrep
parash
e 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).