คำสั่งไฟล์ Linux การจำแนกไฟล์


17

ฉันต้องรู้จักชนิดของข้อมูลที่อยู่ในไฟล์สุ่ม ฉันยังใหม่กับ Linux

ฉันวางแผนที่จะใช้fileคำสั่งเพื่อทำความเข้าใจกับชนิดของไฟล์ข้อมูลที่มี ฉันลองคำสั่งนั้นและรับผลลัพธ์ด้านล่าง

มีคนแนะนำฉันว่าfileคำสั่งดูไบต์เริ่มต้นของไฟล์เพื่อกำหนดชนิดข้อมูล fileคำสั่งไม่ได้ดูที่นามสกุลไฟล์ที่ทั้งหมด ถูกต้องหรือไม่ ฉันดูที่หน้าคนแต่รู้สึกว่ามันช่างเกินไป ฉันจะขอบคุณถ้าใครสามารถให้ลิงค์ซึ่งมีคำอธิบายที่ง่ายกว่ามากเกี่ยวกับการfileทำงานของคำสั่ง

คำตอบที่เป็นไปได้ต่างกันที่ฉันสามารถหาได้หลังจากรันfileคำสั่งคืออะไร ตัวอย่างเช่นในการถอดเสียงด้านล่างฉันได้รับ JPEG, ISO, ASCII และอื่น ๆ :

เอาท์พุทหน้าจอเป็นดังนี้

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


อัปเดต 1

ขอบคุณสำหรับคำตอบและพวกเขาชี้แจงสิ่งต่าง ๆ ให้ฉัน

ดังนั้นถ้าฉันเข้าใจอย่างถูกต้องโฟลเดอร์ / usr / share / mime / magic มีฐานข้อมูลที่จะให้ฉันเป็นรูปแบบไฟล์ที่เป็นไปได้ในปัจจุบัน (ผลลัพธ์ที่ฉันจะได้รับเมื่อฉันพิมพ์คำสั่งไฟล์และปฏิบัติตามมันด้วยไฟล์) ถูกต้องหรือไม่ เป็นความจริงหรือไม่ว่าเมื่อใดก็ตามที่เอาต์พุตคำสั่ง 'ไฟล์' มีคำว่า "text" หมายถึงสิ่งที่คุณสามารถอ่านด้วยโปรแกรมดูข้อความและสิ่งใดก็ตามที่ไม่มี "text" เป็นไบนารีบางชนิด


6
ในอนาคตไม่แนะนำให้โพสต์รูปภาพของเทอร์มินอลเอาท์พุท ใช้การจัดรูปแบบบล็อกรหัส markdown
HalosGhost

3
ฉันลบภาพและโพสต์รหัส
user2543622

เช่นเดียวกับหมายเหตุ: หากไฟล์ไม่สามารถระบุไฟล์ได้บ่อยครั้งที่TrIDสามารถทำได้ มันมีฐานข้อมูลคุณสมบัติไฟล์ของตัวเองสร้างขึ้นโดยชุมชนที่ใช้มัน
Josef พูดว่า Reinstate Monica

คำตอบ:


13

file ใช้การทดสอบหลายประเภท :

1: หากไฟล์ไม่มีอยู่ไม่สามารถอ่านได้หรือไม่สามารถระบุสถานะไฟล์ได้เอาต์พุตจะระบุว่าไฟล์นั้นถูกประมวลผล แต่ไม่สามารถระบุประเภทของไฟล์ได้

cannot open file: No such file or directoryนี้จะเป็นเอาท์พุทเช่น

2: หากไฟล์ไม่ใช่ไฟล์ปกติประเภทไฟล์จะถูกระบุ ไดเรกทอรีประเภทไฟล์, FIFO, ซ็อกเก็ต, บล็อกพิเศษและอักขระพิเศษจะถูกระบุเช่นนี้ ประเภทไฟล์ที่กำหนดไว้สำหรับการนำไปใช้งานอื่นอาจระบุได้เช่นกัน หากไฟล์เป็นลิงก์สัญลักษณ์โดยค่าเริ่มต้นลิงก์จะได้รับการแก้ไขและไฟล์จะทดสอบประเภทของไฟล์ที่อ้างอิงโดยลิงก์สัญลักษณ์ (ดู-hและ-iตัวเลือกด้านล่าง)

นี้จะเป็นเอาท์พุทเช่นและ.: directory /dev/sda: block specialรูปแบบส่วนใหญ่สำหรับสิ่งนี้และจุดก่อนหน้านี้ถูกกำหนดโดย POSIX บางส่วน - คุณสามารถพึ่งพาสตริงบางตัวที่อยู่ในเอาต์พุต

3: หากความยาวของไฟล์เป็นศูนย์จะต้องระบุว่าเป็นไฟล์ว่าง

foo: emptyนี่คือ

4: ยูทิลิตี้ไฟล์จะตรวจสอบส่วนเริ่มต้นของไฟล์และจะทำการเดาที่จะระบุเนื้อหาของมันตามการทดสอบที่ไวต่อตำแหน่ง (คำตอบไม่รับประกันว่าจะถูกต้องโปรดดูที่ตัวเลือก -d, -M และ -m ด้านล่าง)

5: ยูทิลิตี้ไฟล์จะตรวจสอบไฟล์และทำการเดาที่ระบุเนื้อหาของมันตามการทดสอบระบบเริ่มต้นตามบริบท (คำตอบไม่รับประกันว่าจะถูกต้อง)

ทั้งสองใช้การระบุหมายเลขมายากลและเป็นส่วนที่น่าสนใจที่สุดของคำสั่ง จำนวนมายากลเป็นลำดับพิเศษของไบต์ที่อยู่ในสถานที่ที่เป็นที่รู้จักกันในแฟ้มที่ระบุประเภทของ ตามปกติแล้วสถานที่นั้นเป็นสองไบต์แรก แต่มีการขยายคำเพิ่มเติมเพื่อรวมสตริงที่ยาวขึ้นและตำแหน่งอื่น ๆ ดูคำถามอื่น ๆ นี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหมายเลขมายากลในfileคำสั่ง

fileคำสั่งมีฐานข้อมูลของตัวเลขเหล่านี้และสิ่งที่พวกเขาพิมพ์ตรงตามลักษณะที่; ว่าฐานข้อมูลมักจะอยู่ใน/usr/share/mime/magicและแผนที่เนื้อหาไฟล์ชนิด MIME ผลลัพธ์ที่มี (มักเป็นส่วนหนึ่งของfile -iถ้าคุณไม่ได้รับมันโดยค่าเริ่มต้น) จะเป็นประเภทสื่อที่กำหนดไว้หรือส่วนขยาย "การทดสอบตามบริบท" ใช้วิธีการแบบเดียวกัน แต่เป็นฝอยเล็กน้อย สิ่งเหล่านี้ไม่ได้รับประกันว่าจะถูกต้อง แต่พวกเขาตั้งใจจะเดาได้ดี

fileนอกจากนี้ยังมีการทำแผนที่ฐานข้อมูลประเภทที่ชื่อโดยที่มันจะรู้ว่าไฟล์จะมีการระบุว่าเป็นสามารถอธิบายว่าเป็นapplication/pdf PDF documentชื่อที่มนุษย์สามารถอ่านได้เหล่านั้นอาจถูกแปลเป็นภาษาอื่นด้วย สิ่งเหล่านี้จะเป็นคำอธิบายระดับสูงของประเภทไฟล์ในแบบที่คนจะเข้าใจแทนที่จะเป็นเครื่อง

เอาต์พุตส่วนใหญ่ที่คุณจะได้รับนั้นมาจากขั้นตอนเหล่านี้ คุณสามารถดูmagicไฟล์เพื่อดูรายการประเภทที่รองรับและวิธีการระบุ - ระบบของฉันรู้ชนิดที่ต่างกัน 376 รายการ ชื่อที่ให้และประเภทที่รองรับนั้นถูกกำหนดโดยแพ็คเกจระบบและการกำหนดค่าของคุณดังนั้นระบบของคุณอาจรองรับมากกว่าหรือน้อยกว่าของฉัน แต่โดยทั่วไปมีจำนวนมาก libmagicรวมถึงการทดสอบฮาร์ดโค้ดเพิ่มเติมในนั้น

6: ไฟล์จะถูกระบุว่าเป็นไฟล์ข้อมูล

นี่คือfoo: dataเมื่อมันล้มเหลวในการคิดออกอะไรเกี่ยวกับไฟล์

นอกจากนี้ยังมีแท็กเล็ก ๆ อื่น ๆ ที่สามารถปรากฏขึ้นได้ ไฟล์ executable ( +x) จะรวม " executable" ในผลลัพธ์โดยปกติคั่นด้วยเครื่องหมายจุลภาค fileการดำเนินงานนอกจากนี้ยังอาจจะรู้ว่าสิ่งพิเศษเกี่ยวกับรูปแบบไฟล์บางอย่างที่จะสามารถอธิบายจุดเพิ่มเติมเกี่ยวกับพวกเขาในขณะที่ "คุณPDF document, version 1.4"


8

หน้าคนมักจะอ้างอิงสั้น ๆ ไม่ใช่การแนะนำตัว เริ่มต้นด้วยหน้าวิกิพีเดีย

fileดูที่เนื้อหาไฟล์เท่านั้นไม่ใช่ที่ชื่อไฟล์ (นอกจากนี้ยังดูที่ข้อมูลเมตาของไฟล์เช่นประเภทไฟล์: ไดเรกทอรีลิงก์สัญลักษณ์ชื่อไปป์เป็นต้น แต่ในกรณีที่คุณสนใจมันเป็นเนื้อหาที่สำคัญ)

fileมักจะคาดเดารูปแบบของไฟล์โดยดูที่แรกไม่กี่ไบต์และเปรียบเทียบพวกเขาด้วยในตัวตารางของหมายเลขมายากล ตัวอย่างเช่นหากไฟล์เริ่มต้น%PDFให้fileรายงาน“ เอกสาร PDF” (และไปขุดเพิ่มเติมเพื่อรายงานเวอร์ชันขั้นต่ำ) สำหรับประเภทไฟล์ที่ไม่ได้เริ่มต้นด้วยหมายเลขเวทย์มนตร์นั้นจะมีการวิเคราะห์พฤติกรรมเช่นรายงาน“ ASCII text” หากสองสามไบต์แรกนั้นอยู่ในช่วง ASCII ที่พิมพ์ได้

ผลลัพธ์ของการfileเปราะบาง: มันอาจแตกต่างจากตัวแปร unix เป็น unix variant และจาก version ถึง version บน Linux, Cygwin และ * BSD fileคำสั่งสนับสนุนตัวเลือก-iที่สร้างผลลัพธ์ที่สามารถคาดการณ์ได้ในรูปแบบของชนิด สื่อMIME (IANA จัดการรายการประเภทสื่อมาตรฐาน ) มีรายละเอียดไม่มากนักและการส่งออกนั้นไม่เป็นมิตรกับมนุษย์ แต่ผลลัพธ์นั้นสามารถคาดเดาได้และเป็นมิตรกับคอมพิวเตอร์

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

ใช้ถ้าคุณต้องการสิ่งที่ชนิดของตัวเองโดยไม่มีการเข้ารหัสข้อมูลเช่นfile --mime-type application/pdfผ่านตัวเลือก-bหากคุณไม่ต้องการแสดงชื่อไฟล์ที่จุดเริ่มต้นของบรรทัด


5

ผมอยากให้คุณอ่านคำตอบจากที่นี่ ข้อความที่ตัดตอนมาบางส่วนจากคำตอบคือ

จาก man page ของfileคำสั่ง

file คำสั่งดำเนินการทดสอบ 3 อย่างเกี่ยวกับการกำหนดประเภทไฟล์

การทดสอบครั้งแรก

การทดสอบระบบไฟล์ขึ้นอยู่กับการตรวจสอบการส่งคืนจากการเรียกระบบ stat (2)

การทดสอบครั้งที่สอง

การทดสอบหมายเลขเวทมนต์จะใช้เพื่อตรวจสอบไฟล์ที่มีข้อมูลในรูปแบบคงที่โดยเฉพาะ

การทดสอบที่สาม

การทดสอบภาษาจะค้นหาสตริงเฉพาะ (cf names.h) ที่สามารถปรากฏที่ใดก็ได้ในบล็อกสองสามช่วงแรกของไฟล์ ตัวอย่างเช่นคีย์เวิร์ด. br ระบุว่าไฟล์น่าจะเป็นไฟล์อินพุต troff (1) เช่นเดียวกับโครงสร้างคีย์เวิร์ดระบุโปรแกรม C

เอาต์พุตของfileคำสั่งโดยทั่วไปขึ้นอยู่กับผลลัพธ์ของการทดสอบใด ๆ ที่ทำสำเร็จ

ทีนี้สมมติว่าโปรแกรม C ++ เริ่มต้นเช่นนี้และการทดสอบครั้งที่สามก็สำเร็จ

#include <iostream.h>
bla
bla

จากการทดสอบครั้งที่สามคำหลัก#includeระบุว่าเป็นโปรแกรมประเภทCแม้ว่าเราจะมีโปรแกรมCPPในมือ ตอนนี้เมื่อฉันตรวจสอบ

$ file example.cpp

example.cpp: ASCII C program text

ตอนนี้แนวคิดของการวางวัตถุนั้นมีความเฉพาะกับ C ++ ขอให้เราสร้างเฉพาะไฟล์C ++

ฉันเริ่มโปรแกรม C ++ เป็น

Class something
{
}
bla
bla

ตอนนี้เมื่อฉันออก

$ file example.cpp

ผลลัพธ์คือ

example.cpp: ASCII C++ program text

สิ่งนี้อธิบายโดยทั่วไปเกี่ยวกับวิธีการที่fileคำสั่งทำงานกับไฟล์ที่คล้ายกัน (ในตัวอย่างนี้โปรแกรม C และโปรแกรม C ++ จะได้รับการปฏิบัติเหมือนกันเว้นแต่และจนกว่าเราจะใช้คุณสมบัติเชิงวัตถุที่เฉพาะเจาะจงกับ C ++)


1

Gilles และ Michael Homer ให้คำตอบที่ยอดเยี่ยม ซึ่งฉันแนะนำให้คุณ หากต้องการดูประเภทของไฟล์ที่รู้จักบนระบบของคุณลองเรียกใช้

cat /usr/share/magic

หากนั่นทำให้เกิดปัญหาสิทธิ์หรือไม่มีอยู่อาจเป็นไปได้

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(อาจต้องปรับแต่งขึ้นอยู่กับระบบของคุณ) ซึ่งควรแสดงรายการประเภทไฟล์ในระบบของคุณ คำสั่งนี้อาจใช้เวลานานในการรันขึ้นอยู่กับขนาดของระบบไฟล์รูทของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.