สร้างรายการไฟล์ตามรูปแบบเวลาในชื่อไฟล์


0

ฉันมีอุปกรณ์บันทึกภาพของกล้องที่จะสร้างโฟลเดอร์ที่มีโครงสร้างพร้อมวิดีโอเช่นตัวอย่างด้านล่าง

ฉันต้องการสร้างรายการไฟล์วิดีโอ แต่จะสร้างเฉพาะช่วงเวลาที่กำหนด เช่นระหว่าง 8:00 - 17:00 น. (วิดีโอที่อยู่นอกช่วงนี้มีคุณภาพไม่ดีเนื่องจากแสงน้อย)

ชื่อไฟล์มีโครงสร้างดังนี้: [DATE Folder] AM | PM / sricam- [date] - [time] -sequence # .mp4

ด้วยตัวอย่างต่อไปนี้ตัวกรองจะแสดงเฉพาะไฟล์ที่เริ่มต้นที่ 8h08: 15

/data/20171229AM/sricam-20171229-070814-1514520494.mp4
/data/20171229AM/sricam-20171229-073814-1514522294.mp4
/data/20171229AM/sricam-20171229-080815-1514524095.mp4
/data/20171229PM/sricam-20171229-180815-1513553225.mp4

ฉันพบว่ารูปแบบการขยายรั้งสามารถกรองตัวเลข แต่วิธีการทำมันในโฟลเดอร์ย่อยทั้งหมด

ฉันหวังว่าคำอธิบายของฉันจะไม่สับสนเกินไป :)

ขอขอบคุณ


PM เป็นช่วงเวลาจริงๆในโฟลเดอร์ AM ด้วยหรือไม่
tripleee

นี่เป็นตัวพิมพ์ใหญ่เนื่องจากฉันแก้ไขตัวอย่างด้วยตนเองเพื่อให้มีกรณีใช้งานโดยไม่มีตัวอย่างขนาดใหญ่ ตอนนี้ได้รับการแก้ไขแล้วขอบคุณ
สูงสุด

คำตอบ:


1

หลังจากลอง & ผิดพลาดฉันพบว่า awk เหมาะสมกว่าสำหรับการทำตัวกรอง

ฉันมาถึงวิธีแก้ปัญหาหนึ่งบรรทัดนี้:

find $PWD -name "*.mp4" |  awk  -F- '{ if ( substr($3,1,2) <= "17" &&  substr($3,1,2) >= "08")  print $0 }'

แต่ให้ฉันอธิบาย:

find $PWD -name "*.mp4"   ## find all videos and print full path


awk -F-                   ## tels awk that the separator is dash character : -

ตอนนี้ตัวอย่างเส้นทางออกของฉันจะถูกแยกออกเป็น 4 "คอลัมน์" (นับ 3 เส้นประ) และแต่ละคอลัมน์เข้าถึงได้ถึง $ n

คอลัมน์ที่น่าสนใจตรงนี้คือ $ 3 เพราะมันมีเวลา

$ 0 = /data/20171229AM/sricam-20171229-070814-1514520494.mp4

$ 1 = / data / 20171229AM / sricam

$ 2 = 20171229

$ 3 = 070814

$ 4 = 514520494.mp4

เราต้องทำการกรองเงื่อนไข: ถ้าชั่วโมงอยู่ระหว่าง 08 ถึง 17 จากนั้นพิมพ์บรรทัด

substr($3,1,2)          ## take the two first chars from $3 column starting at position 1

substr ($ 3,1,2) <= "17"

สังเกตเครื่องหมายคำพูดประมาณ 17 ซึ่งหมายความว่า "แปลงเป็นสตริง" โดยไม่มีเงื่อนไขสองเงื่อนไขในคำสั่ง if จะไม่เป็นจริง

print $0        ##   print the whole line (without the splitting)

ขอบคุณทุกคนสำหรับคำแนะนำทั้งหมดของคุณ


วิธีแก้ปัญหาที่ดี @ Max และสามารถอ่านได้ง่ายกว่าของฉันอย่างแน่นอน มันอาจจะทำให้สำนวนมากขึ้น (และสั้นกว่า) แต่นั่นเป็นทางเลือกที่แน่นอน เช่นนี้: find -name "*.mp4" | awk -F- 'substr($3,1,2) >= "08" && substr($3,1,2) <= "17"'เป็น$PWDค่าเริ่มต้นสำหรับfindและprint $0เป็นการกระทำเริ่มต้นใน Awk
Edward

0

นอกจากว่าฉันเข้าใจผิดในสิ่งที่คุณขอคุณสามารถรวมไวลด์การ์ดในแบบที่คุณต้องการรวมถึงการจับคู่ในไดเรกทอรีย่อย ดังนั้นสิ่งนี้ควรทำในสิ่งที่คุณต้องการ: (ฉันยังไม่ได้ทดสอบด้วยตัวเอง)

/data/*/sricam-*-{08,09,10,11,12,13,14,15,16,17}????-*.mp4

ไม่ชัดเจนว่าคุณต้องการยกเว้นวิดีโอที่เริ่มต้นตั้งแต่เวลา 17:00 น. หรือไม่ หากคุณต้องการรวมเวลา 17:00:00 แต่ไม่รวมสิ่งใดหลังจากนั้น (พูด) คุณสามารถรวมนิพจน์ไวด์การ์ดหลายรายการ:

/data/*/sricam-*-{08,09,10,11,12,13,14,15,16}????-*.mp4 /data/*/sricam-*-170000-*.mp4

(สังเกตช่องว่างระหว่างนิพจน์)


ฉันต้องการวิดีโอตั้งแต่ 08.00 น. ถึง 17.00 น. (ตามที่ระบุไว้มีโฟลเดอร์ AM & PM สำหรับบันทึกทุกวัน) ฉันทดสอบคำสั่ง wildcard เป็น ' ls - {08,09,10,11,12,13,14,15,15 , 16,17} ???? - .mp4 'และมันกรองไฟล์ของฉัน แต่สำหรับผลลัพธ์ที่ไม่ตรงกันมันจะแสดงรายการเช่น' /20180201PM/*-08????-*.mp4 'เนื่องจากรายการที่ฉันต้องการ เพื่อให้มีเส้นทางแบบเต็มของชื่อไฟล์ฉันใช้คำสั่งreadlink -f * .mp4แต่ด้วยการค้นหาคำสั่ง readlink แบบเรียกซ้ำมันก็ทำผลลัพธ์แปลก ๆ ออกมา
Max

ฉันจะใช้นิพจน์ตัวแทนนี้กับคำสั่ง find ได้อย่างไร อักขระตัวแทนเดียวกันที่ใช้กับ ls จะไม่ส่งคืนสิ่งใดเมื่อใช้กับ: find -name หรือ -iname พารามิเตอร์ขอขอบคุณคุณ
สูงสุด

ขออภัย @ Max ฉันเห็นความคิดเห็นของคุณแล้วตอนนี้ findไม่ทราบว่าคุณต้องการที่จะใช้ findรวมนิพจน์ตัวแทนจะไม่ทำงานกับ เนื่องจากวิธีการแก้ปัญหาของคุณอ่านได้ง่ายขึ้นฉันจึงเพิ่มระดับให้คุณมากกว่าที่จะปรับใช้ทุ่นระเบิด
Edward

ขอบคุณ @Edward สำหรับความคิดเห็น & การแก้ไข .. ฉันไม่รู้ตอนแรกว่าอะไรคือเส้นทางที่ดีที่สุดและง่ายที่สุดในการติดตาม ;)
สูงสุด

0

สัญลักษณ์แทน Bash จะแก้ปัญหานี้ได้เล็กน้อย คำสั่งใด ๆ ที่อนุญาตให้คุณส่งต่อในอาร์กิวเมนต์ชื่อไฟล์หลายชื่อจะอนุญาตให้คุณส่งผ่านอักขระตัวแทนจำนวนมาก

printf '%s\n' 20171229AM/sricam-20171229-0[89]*.mp4 20171229AM/sricam-20171229-1[01]*.mp4 20171229PM/sricam-20171229-1[2-6]*.mp4

คุณสามารถใช้อาร์กิวเมนต์เดียวกับไดรเวอร์สำหรับการวนซ้ำ:

for file in 20171229AM/sricam-20171229-0[89]*.mp4 20171229AM/sricam-20171229-1[01].mp4 20171229PM/sricam-20171229-1[2-6]*.mp4; do
    : things with "$file"
done

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

นี่คือรูปแบบ "glob" ไม่ใช่นิพจน์ทั่วไป Bash มีสิ่งอำนวยความสะดวกแบบขยายซึ่งอยู่ใกล้กับ regex แต่ก็ยังไม่ regex อย่างแน่นอน แต่นั่นไม่จำเป็นสำหรับงานง่าย ๆ นี้

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