ฉันจะแสดงไฟล์ทุกประเภทที่มีอยู่ในไดเรกทอรีได้อย่างไร?


12

มีคำสั่งใดบ้างที่บอกฉันในไดเรกทอรีเฉพาะว่ามีไฟล์ประเภทใดบ้าง

od -c myfile | lessฉันจะสามารถหาชนิดของไฟล์โดยใช้คำสั่งเช่น

แต่ฉันไม่รู้ว่าจะทำอย่างไรกับไฟล์ทั้งหมดในไดเรกทอรี

คำตอบ:


19

แม้ว่าod -cจะแสดงเนื้อหาของไฟล์ แต่ก็ไม่ได้เป็นวิธีที่ดีในการรับไฟล์ ในขณะที่บางไฟล์จะมีส่วนหัวที่มีประเภทไฟล์ แต่จะไม่ทั้งหมด วิธีที่ดีกว่าคือคำสั่งfile:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

ดังนั้นหากต้องการรับรายการประเภทไฟล์ทั้งหมดในไดเรกทอรีคุณสามารถทำได้:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

ตัวอย่างผลลัพธ์:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

คำอธิบาย

  • for file in dir/*; do ... done;: วนซ้ำทุกอย่างในdir( dirเป็นเพียงตัวอย่างคุณควรเปลี่ยนสิ่งนี้เป็นชื่อของไดเรกทอรีจริงที่คุณต้องการค้นหา) บันทึกแต่ละรายการตามลำดับ$file
  • file "$file": เรียกใช้fileในแต่ละรายการที่พบ
  • cut -d: -f 2: พิมพ์เฉพาะฟิลด์ที่สอง (ฟิลด์ที่กำหนดโดย:)
  • sed 's/^ //; s/ +/ /g' : ลบช่องว่างจากจุดเริ่มต้นของบรรทัดและแปลงช่องว่างที่ต่อเนื่องกันเป็นช่องว่างเดียว
  • sort -u : ลบไฟล์ประเภทที่ซ้ำกัน

ขอบคุณ แต่ฉันคัดลอกและที่ผ่านมา "สำหรับไฟล์ใน dir / *; ทำไฟล์" $ file "| cut -d: -f 2 | sort -u; เสร็จแล้ว" ใน terminal ของฉันและฉันได้รับ "ข้อผิดพลาด"
Mohammad Reza Rezwani

2
@alex ก่อนอื่นโปรดพูดถึงข้อผิดพลาดที่คุณได้รับเสมอโดยบอกว่าคุณได้รับ "ข้อผิดพลาด" ไม่เป็นประโยชน์ ไม่ว่าในกรณีใด ๆ ข้อผิดพลาดอาจเป็นเพราะคุณไม่มีชื่อไดเรกทอรีdir/ซึ่งเป็นเพียงชื่อตัวอย่างคุณจะต้องเปลี่ยนเป็นชื่อของไดเรกทอรีจริงfor file in /home/alex/*; do ... doneตัวอย่างเช่น
terdon

ขอบคุณถ้าคุณทำผิดฉัน (... ฉันคิดว่า dir เป็นคำสั่งเหมือน ls ไม่ directory - กังวล - ฉันคิดว่าดีกว่าที่จะแก้ไขคำตอบของคุณ) คุณเพิ่งเห็น "ข้อผิดพลาด" และไม่มีอะไรอื่น
Mohammad Reza Rezwani

เป็นงานที่ดี แต่ฉันเห็นตัวอย่างสี่บรรทัด "ไฟล์เสียงที่มี ID3 เวอร์ชัน 2.3.0 มี" หรือมากกว่าหนึ่ง "สื่อ ISO, ระบบ MPEG v4, รุ่น 2" ฉันไม่แน่ใจเกี่ยวกับ "ลบสำเนา"
Mohammad Reza Rezwani

@alex ยุติธรรมเพียงพอตอบแก้ไข คุณไม่ควรได้รับสิ่งที่ซ้ำซ้อน ความsort -uประสงค์ที่จะลบพวกเขาบรรทัดจะต้องแตกต่างกัน (พวกเขาอาจมีจำนวนช่องว่างที่แตกต่างกันซึ่งทำให้พวกเขาไม่เหมือนกัน)
terdon

3

ฉันอาจจะทำอะไรเช่นนี้ -

find . -type f -exec file {}  \;

ที่จะค้นหาจากเส้นทางปัจจุบันสำหรับไฟล์ (เช่นไม่มีไดเรกทอรี) จากนั้นดำเนินการfileคำสั่งในแต่ละไฟล์


1

ลองสิ่งนี้:

ls | xargs file -b | sort | uniq

มันทำงานอย่างไร:

ls : รายการเนื้อหาไดเรกทอรี

ไฟล์ -b : กำหนดประเภทของไฟล์; ห้ามเติมชื่อไฟล์ลงในบรรทัดเอาต์พุต

sort : เรียงลำดับบรรทัด

uniq : ละเว้นบรรทัดซ้ำ



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