Você pode usar awk
para pesquisar arquivos com texto ASCII:
less $(file * | awk -F: '$2 ~ "ASCII text" {print $1}')
Isso realmente funciona também para diretórios contendo vários arquivos de texto.
Portanto, eu tenho um diretório onde desejo abrir o único arquivo nesse diretório legível para humanos. Eu uso file *
para imprimir o tipo de cada arquivo e um arquivo é exibido como texto ASCII. Como posso redirecionar esse arquivo específico para cat ou menos para exibir seu conteúdo?
EDITAR:
Vocês são incríveis. Estou tentando cada um.
A seguinte função bash procurará os arquivos no diretório atual; se exatamente um deles reportar como sendo "texto ASCII", então cat
será o arquivo.
filecat() {
local files=(./*)
local count=0
local filename=
local f=
for f in "${files[@]}"
do
if file "$f" 2>/dev/null | grep -q ": ASCII text$"
then
count=$((count + 1))
filename="$f"
fi
done
if [ "$count" -eq 1 ]
then
cat "$filename"
fi
}
Com zsh
, você pode definir uma função como:
istext() [[ $(file -b --mime-type -- "${1-$REPLY}") = text/* ]]
Qual você poderia usar em qualificadores glob, como:
less -- *(.L+0+istext)
Para exibir os arquivos regulares não vazios ( L+0
para comprimento maior que 0) no diretório atual, que são de acordo com .
.
Aqui está uma maneira segura de abrir o que file
acha que são arquivos de texto no diretório atual em vim
. Claro, você pode mudar vim
para echo
para apenas imprimir os nomes.
#!/bin/bash
for f in *; do
out=$(file "$f")
[[ "${out##*: }" =~ ASCII ]] && text_files+=("$f")
done
vim "${text_files[@]}"
exit
EDIT: use dois sinais #
na expansão de parâmetro para manipular nomes de arquivos com :
neles.
Para apenas less
de um arquivo, se for um texto ASCII:
less_if_text() {
# $1 is the file name
if file $1 | grep -q 'ASCII .* text' ; then
less $1
else
echo "Not a text file: $1"
fi
}
Para listar arquivos de texto de maneira ingênua, mas fácil de entender:
ls_texts() {
ls -a | while read filename; do
(file $filename | grep -q 'ASCII .* text') && echo $filename
done
}
O acima não é muito rápido, no entanto. Uma maneira mais rápida usaria file -f
para evitar várias invocações file
e grep
:
ls_texts() {
ls | file -f - | egrep ':\s+ASCII .* text' | while read fname
do cut -d ':' -f 1
done
}
Tags files file-command shell mime-types