Pertanyaan verifikasi file ASCII dengan perintah file dengan scrript shell


Dengan perintah file saya perlu memverifikasi banyak file jika mereka ASCII atau format lainnya

Terkadang saya dapatkan dari perintah file:

  file1: ASCII English text

Dan terkadang saya mendapatkan jawaban yang berbeda dari perintah file

  file2: Non-ISO extended-ASCII English text, with very long lines

Saya benar-benar tidak yakin apakah ada jawaban lain dengan sintaks yang berbeda

Pertanyaanku adalah:

Saya menulis sintaks follwing ksh untuk memverifikasi apakah file adalah ASCII tetapi saya tidak yakin apakah

sintaks berikut adalah sintaks yang optimal untuk memverifikasi format ASCII?

   [[ ` file  $some_file | grep –c ASCII ` = 1 ]] && print "you have ascii file for sure"

Jika seseorang memiliki saran lain untuk memverifikasi format ASCII pasti !, saya akan sangat senang melihat itu


4
2017-10-26 21:56


asal


ASCII? Di zaman internet dan Unicode? Kamu pasti bercanda. - grawity
Anda menyadarinya file adalah tebakan heuristik dan bukan jaminan, bukan? yes | head -c $((2**20)) > blah; dd if=/dev/urandom bs=1 count=1024 >> blah; file blah kata blah: ASCII text meskipun tidak. - ephemient
ya saya mengerti tapi apa yang harus saya lakukan jika saya ingin melakukan pemilihan jenis file, apa hal terbaik yang harus dilakukan? , ada ide? - jennifer


Jawaban:


if LC_ALL=C grep -q '[^[:print:][:space:]]' file; then
    echo "file contains non-ascii characters"
else
    echo "file contains ascii characters only"
fi

8
2017-10-26 22:25



hi ephemient - tolong jelaskan LC_ALL = C sebelum perintah grep, mengapa? - jennifer
LC_ALL=C pasukan grep untuk mengobati [[:print:]] sebagai kelas karakter "dicetak ASCII". Kalau tidak, itu berarti "dapat dicetak <apa pun lokasi Anda saat ini adalah>", yang mungkin bukan ASCII. Misalnya, sebagian besar kotak Linux diatur dengan lokal UTF-8, dalam hal ini [[:print:]] akan cocok dengan urutan karakter non-ASCII yang merupakan karakter UTF-8 yang dapat dicetak yang valid. - ephemient
@jennifer: name=value command adalah sintaks untuk sementara mengatur variabel lingkungan, dalam hal ini LC_ALL, untuk satu perintah. Setting lokal ke C pastikan [[:print:]] hanya cocok dengan karakter ASCII (dan bukan aksen karakter dari bahasa Anda). - grawity
mengapa saya mendapatkan "file berisi karakter non-ascii" untuk / etc / hosts, karena Anda tahu file host adalah file ASCII? - jennifer
@ Jennifer: Diperbaiki. Mungkin termasuk tab atau sesuatu seperti itu; saya lupa [[:print:]] aku s [[:graph:] ] tidak [[:graph:][:space:]]. - ephemient


Bagaimana tentang...

if file -ib "$file" | grep -Eqs '^text/plain(;|$)'; then
    echo "It's text/plain."
fi

Saya tidak tahu seberapa umum itu --mime-type; jika itu standar, gunakan

if file -b --mime-type "$file" | grep -qs '^text/plain$'; then

kalau tidak grep -qs '^text/' untuk jenis teks apa pun.


1
2017-10-26 22:26





Karena Anda parsing output dengan kode saya sarankan menggunakan -i opsi aktif file jadi hasilnya PANTOMIM bukan tipe string yang ramah manusia. Output tipe MIME lebih teratur dan membuatnya lebih mudah untuk ditangani dalam kode.

Adapun jenis keluaran yang dilihat file man mengatakan itu:

/usr/share/file/magic
    Default list of magic numbers

/usr/share/file/magic.mime
    Default list of magic numbers, used to output  mime types
    when the -i option is specified.

Lihatlah file-file tersebut untuk semua jenis MIME yang dapat dilaporkan untuk menentukan jenis mana yang akan Anda pedulikan saat mengurai keluaran dari file. Saya kira semua yang Anda akan peduli adalah bahwa jenis MIME dimulai dengan text/.


0
2017-10-26 22:23