Como abrir um arquivo baseado na saída do comando 'file'

0

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.

    
por sarpu 22.03.2018 / 18:07

5 respostas

2

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.

    
por 22.03.2018 / 18:23
1

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
}
    
por 22.03.2018 / 19:05
1

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 . .

    
por 22.03.2018 / 19:23
1

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.

    
por 22.03.2018 / 19:07
0

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
}
    
por 22.03.2018 / 18:28