จะค้นหาไฟล์วิดีโอบน Ubuntu ได้อย่างไร


12

ฉันดาวน์โหลดวิดีโอมาสองสามเดือนแล้ว ฉันจำชื่อไม่ได้ดีมาก มีคำสั่งหรือวิธีการใดที่จะส่งออกเฉพาะไฟล์วิดีโอเพื่อให้ฉันสามารถค้นหาวิดีโอที่นั่นได้หรือไม่ จาก man pages ฉันไม่พบตัวเลือกใด ๆ ในการค้นหาที่ทำงาน

ไฟล์วิดีโอที่ฉันดาวน์โหลดอาจมีส่วนขยายใด ๆ (เช่น webm เป็นต้น) และอาจเป็นไปได้ว่าฉันได้เปลี่ยนชื่อเป็นอะไรเช่น 'abcde' ซึ่งตอนนี้ฉันจำไม่ได้แล้ว ดังนั้นการค้นหาไม่สามารถใช้ชื่อไฟล์ได้!

(เพียงแค่พูดถึงสิ่งหนึ่งที่คล้ายคลึงกัน: ใน Perl มีคำสั่งให้ตรวจสอบว่าไฟล์เป็นไฟล์ข้อความหรือไบนารีเป็นต้นในทำนองเดียวกันอาจมีวิธีตรวจสอบว่าไฟล์วิดีโอหรือไฟล์มัลติมีเดีย)

คำตอบ:


15

แนวคิดพื้นฐานคือการใช้ยูทิลิตี้ไฟล์เพื่อกำหนดประเภทของแต่ละไฟล์และกรองไฟล์วิดีโอ

find /some/directory -type f -exec file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p'

สิ่งนี้จะพิมพ์ชื่อของไฟล์ทั้งหมดใน/some/directoryและไดเรกทอรีย่อยซ้ำประเภทMIMEเป็นประเภทวิดีโอ

fileคำสั่งต้องเปิดทุกไฟล์ซึ่งอาจจะช้า เพื่อเร่งความเร็วสิ่งต่างๆ:

  • จำกัด คำสั่งไปยังต้นไม้ไดเรกทอรีที่เป็นไปได้ที่จะเป็นเช่น/tmp, /var/tmpและไดเรกทอรีบ้านของคุณ
  • จำกัด การค้นหาไฟล์ที่มีขนาดอยู่ใน ballpark ด้านขวาพูดอย่างน้อย 10MB
  • จำกัด การค้นหาไฟล์ที่เวลาในการแก้ไขอยู่ใน ballpark ที่ถูกต้อง โปรดทราบว่าการดาวน์โหลดไฟล์อาจกำหนดเวลาการแก้ไขเป็นเวลาของการดาวน์โหลดหรือเก็บรักษาเวลาขึ้นอยู่กับโปรแกรมที่คุณใช้ดาวน์โหลด (และด้วยการตั้งค่าใด) นอกจากนี้คุณยังสามารถกรองเวลาเปลี่ยน inode (ctime) ซึ่งเป็นเวลาที่ไฟล์ถูกแก้ไขครั้งล่าสุดหรือย้ายไปรอบ ๆ (สร้างเปลี่ยนชื่อ ฯลฯ ) ในทางใดทางหนึ่ง

นี่คือตัวอย่างที่ จำกัด เวลาการแก้ไขเป็นอย่างน้อย 60 วันที่ผ่านมาและเวลาจะไม่เกิน 100 วันที่ผ่านมา

find /tmp /var/tmp ~ -type f -size +10M \
     -mtime +60 -ctime -100 \
     -exec file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p'

คำสั่งที่ 1 ของคุณดึงไฟล์อื่น ๆ (นอกเหนือจากวิดีโอ) เป็นจำนวนมาก ตัวอย่างเช่นหนึ่งบรรทัดของเอาต์พุตคือ: /home/ravbholua/Downloads/Music_Command_line/[SOLVED] a code question regarding music file extensions_files/avatar774785_6.gif: image/jpeg; charset=binary อีกบรรทัดหนึ่งของเอาต์พุตคือ: /home/ravbholua/Free Computer Networking Books Download | Ebooks Online Textbooks.html: text/html; charset=iso-8859-1 ฉันต้องการเฉพาะไฟล์วิดีโอที่จะทำงานใน vlc player, ฯลฯ
Ravi

@Ravi ฉันตั้งใจออกจากตัวเลือกเพื่อsedยกเว้นบรรทัดที่ไม่ตรงกัน (และตัวเลือกที่fileจะไม่แยกบรรทัดผิดที่) ดูการแก้ไขของฉัน
Gilles 'หยุดความชั่วร้าย'

ใช่ Gilles นั่นคือสิ่งที่ฉันต้องการ นั่นได้ผลอย่างยอดเยี่ยม! หลังจากใช้คำสั่งของคุณฉันได้รู้ว่าระบบของฉันมีวิดีโอมากมาย (บางวิดีโอสมบูรณ์และบางวิดีโอไม่ครบถ้วน) ซึ่งฉันไม่ทราบ ขอบคุณ.
Ravi

1
นี่เป็นทางออกที่ดีถ้าไฟล์วิดีโอของคุณไม่มีนามสกุลที่คาดการณ์ได้ การหันมาใช้fileเป็นทางเลือกเดียวเท่านั้น
miguelg

13

ค้นหาตามชื่อไฟล์

อย่างที่ Chris พูดไว้ในคำตอบของเขาคุณสามารถใช้findทำสิ่งนี้ได้ แต่ฉันพบว่ามันเร็วกว่ามากในการค้นหาผ่านlocateฐานข้อมูล

สมมติว่า distro ของคุณให้สิ่งอำนวยความสะดวกนี้ส่วนใหญ่จะทำ Ubuntu, Fedora, CentOS ฯลฯ

ตัวอย่าง

$ locate --basename .mp4 .mkv .wmv .flv .webm .mov .avi | head -5
/home/saml/Desktop/sample_mpeg4.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 1.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 10.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 2.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 3.mp4

ค้นหาตามประเภทไฟล์

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

นี่คือรายการคร่าวๆของประเภทไฟล์เหล่านี้จากระบบของฉัน Fedora 19

  • .mp4: สื่อ ISO, ระบบ MPEG v4, เวอร์ชัน 1
  • .mkv: ไฟล์ EBML, ผู้สร้าง matroska
  • .wmv: Microsoft ASF
  • .flv: Macromedia Flash Video
  • .webm: WebM
  • .mov: ISO Media, ภาพยนตร์ QuickTime ของ Apple
  • .avi: AVI

คุณสามารถใช้คำสั่งนี้เพื่อค้นหาไฟล์ทั้งหมดใน/home/<user>ไดเรกทอรีของคุณ

$ find /home/<user> -type f -exec file {} + | \
    grep -E "MPEG v4|EBML|\
      Microsoft ASF|Macromedia Flash Video|WebM|Apple QuickTime movie|AVI"

หรือคุณสามารถใช้fileและค้นหาตามประเภท mime ที่จัดอยู่ในหมวดหมู่ "วิดีโอ"

 -i, --mime
         Causes the file command to output mime type strings rather than 
         the more traditional human readable ones.  Thus it may say 
         ‘text/plain; charset=us-ascii’ rather than “ASCII text”.

ปรับสิ่งที่เราทำด้านบนเป็นดังนี้:

$ find /home/<user> -type f -exec file -i {} + | grep video

คุณสามารถใช้sedเพื่อรับชื่อไฟล์:

$ find /home/<user> -type f -exec file -i {} + |
    sed -n '/video/s/:[^:]\+$//p'

+1 แน่นอนว่าไม่เพียง แต่จะถือว่าlocateติดตั้ง แต่ฐานข้อมูลนั้นถูกสร้างขึ้น
Chris Down

ใช่แล้วฐานข้อมูลมักจะถูกสร้างขึ้นทุกคืนใน distros ส่วนใหญ่ดังนั้นไฟล์ที่เพิ่งเพิ่มจะไม่อยู่ในฐานข้อมูลจนกว่างานยามค่ำคืนจะทำงานและเพิ่มเข้ามา
slm

1
คุณลืมหนึ่งในสิ่งธรรมดาที่สุด, avi.
Faheem Mitha

6

เนื่องจากขณะนี้คุณระบุว่าไม่สามารถขยายได้คุณสามารถอ่านfile(คำเตือน: อาจใช้เวลานาน):

find ~ -type f -exec file -i {} + | grep video 

หากคุณสามารถค้นหาด้วยชื่อไฟล์สมมติว่ามันมีส่วนขยายวิดีโอทั่วไปและอยู่ในไดเรกทอรีหลักของคุณ:

find ~ -type f -name '*.mkv' -o -name '*.mp4' -o -name '*.wmv' -o -name '*.flv' -o -name '*.webm' -o -name '*.mov'

คุณยังสามารถใช้ regex:

find ~ -type f -regex '.*\.\(mkv\|mp4\|wmv\|flv\|webm\|mov\)'

หากคุณมีความคิดที่ดีเกี่ยวกับเมื่อคุณดาวน์โหลดมัน (และสมมติว่า mtime ถูกตั้งค่าเป็นเวลานั้น) คุณสามารถลองลดขนาดลงด้วย-mtimeตัวเลือกของ GNU find


1
นอกจากนี้คุณยังสามารถแสดงไฟล์ทั้งหมดที่มีขนาดใหญ่กว่าขีด จำกัด บางอย่าง (สมมติว่าไฟล์วิดีโอมีขนาดใหญ่มาก) ...
ChuckCottrill

Chris Down วิธีการใช้ชื่อไฟล์นั้นจะไม่ทำงาน ฉันได้แก้ไขคำถามของฉันโปรดดู
Ravi

@Ravi ดูคำตอบที่อัปเดตของฉันซึ่งใช้ชนิดไฟล์
Chris Down

คำสั่งที่ 1 ของคุณดึงไฟล์อื่น ๆ (นอกเหนือจากวิดีโอ) เป็นจำนวนมาก ตัวอย่างเช่นหนึ่งบรรทัดจากเอาต์พุตคือ: /home/ravbholua/Downloads/Music_Command_line/Any s_w to cut_add audio files, convert video to audio?_files/post_old.gif: image/gif; charset=binary บรรทัดอื่นจากเอาต์พุตคือ: /home/ravbholua/Downloads/Music_Command_line/command line - how to start a video from the terminal? - Ask Ubuntu.html: text/html; charset=utf-8 มันไม่ได้แก้จุดประสงค์ของฉัน
Ravi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.