Как открыть файл на основе вывод команды `file`

Это перенаправления.

  • 0 <& - закрывает файловый дескриптор 0 (стандартный ввод).
  • &> перенаправляет и stdout, и stderr (в данном случае в файл журнала)

Вы уверены, что не было echo до $! ? $! будет интерпретироваться как команда и, скорее всего, приведет к

-bash: 18552: command not found
0
23.03.2018, 01:10
5 ответов

Вы можете использовать awkдля поиска файлов, содержащих текст ASCII:

less $(file * | awk -F: '$2 ~ "ASCII text" {print $1}')

На самом деле это работает и для каталогов, содержащих несколько текстовых файлов.

2
28.01.2020, 02:16

Только для lessфайла, если это текст 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
}

Чтобы вывести список текстовых файлов простым, но понятным способом:

ls_texts() {
  ls -a | while read filename; do 
    (file $filename | grep -q 'ASCII.* text') && echo $filename
  done
}

Вышеупомянутое не совсем быстро, однако. Более быстрый способ использовать file -f, чтобы избежать множественных вызовов fileи grep:

ls_texts() {
  ls | file -f - | egrep ':\s+ASCII.* text' | while read fname
    do cut -d ':' -f 1 
  done
}
0
28.01.2020, 02:16

Следующая функция bash просматривает файлы в текущем каталоге; если только один из них сообщает обратно как «текст ASCII», то он будет catэтим файлом.

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
}
1
28.01.2020, 02:16

Вот безопасный способ открыть то, что fileсчитает текстовыми файлами в текущем каталоге в vim. Конечно, вы можете изменить vimна echo, чтобы просто печатать имена.

#!/bin/bash

for f in *; do
   out=$(file "$f")
   [[ "${out##*: }" =~ ASCII ]] && text_files+=("$f")
done

vim "${text_files[@]}"

exit

РЕДАКТИРОВАТЬ :использовать два знака #в расширении параметра для обработки имен файлов с :в них.

1
28.01.2020, 02:16

С помощью zshвы можете определить такую ​​функцию, как:

 istext() [[ $(file -b --mime-type -- "${1-$REPLY}") = text/* ]]

Которые затем можно было бы использовать в квалификаторах glob, таких как:

 less -- *(.L+0+istext)

Для просмотра не -пустых(L+0длины больше 0 )обычных файлов(.)в текущем каталоге, которые являются текстовыми в соответствии с file.

1
28.01.2020, 02:16

Теги

Похожие вопросы