Eu usaria file
e canalizaria a saída para grep ou awk para encontrar arquivos de texto, e então extrairia apenas a parte do nome do arquivo da saída de file
e canalizaria isso para xargs.
algo como:
file * | awk -F: '/ASCII text/ {print $1}' | xargs -d'\n' -r flip -u
Note que o grep procura por 'texto ASCII' em vez de apenas 'texto' - você provavelmente não quer mexer com documentos em Rich Text ou arquivos de texto unicode, etc.
Você também pode usar find
(ou qualquer outra coisa) para gerar uma lista de arquivos para examinar com file
:
find /path/to/files -type f -exec file {} + | \
awk -F: '/ASCII text/ {print $1}' | xargs -d'\n' -r flip -u
O argumento -d'\n'
para xargs faz com que os xargs tratem cada linha de entrada como um argumento separado, atendendo assim aos nomes de arquivos com espaços e outros caracteres problemáticos. ou seja, é uma alternativa para xargs -0
quando a origem de entrada não gera ou não pode gerar saída separada por NULL (como find
's -print0
option). De acordo com o changelog, xargs tem a opção -d
/ --delimiter
em setembro de 2005, então deve estar em qualquer distro linux não antiga (eu não tinha certeza, e é por isso que eu verifiquei - eu apenas me lembrava vagamente que era um " recente "adição".
Observe que um avanço de linha é um caractere válido em nomes de arquivos, portanto, isso será interrompido se algum nome de arquivo tiver alimentação de linha neles. Para usuários unix típicos, isso é patologicamente insano, mas não é inédito se os arquivos foram originados em máquinas Mac ou Windows.
Observe também que file
não é perfeito. É muito bom em detectar o tipo de dados em um arquivo, mas pode ficar confuso ocasionalmente.
Eu tenho usado inúmeras variações deste método muitas vezes no passado com sucesso.