วิธีการดึงไฟล์จากเนื้อหาระยะไกลตามชื่อไฟล์บางส่วน?


1

ฉันมีโฟลเดอร์ย่อย (A, B, C, D .. ) ในเซิร์ฟเวอร์ระยะไกลซึ่งมีไฟล์ประมาณ 100.gz รูปแบบการตั้งชื่อไฟล์นั้นเหมือน ND2_58_20151105173030_20151105173240_1234.log.gz โดยที่ฟิลด์ 3-rd และ 4-th หลังจาก _ คือเวลาเริ่มต้นและสิ้นสุด ตอนนี้ถ้าเวลาเริ่มต้น / เวลาสิ้นสุดอยู่ที่ 15 นาทีจากเวลาปัจจุบันฉันต้องการดึงไฟล์นั้นใคร ๆ แนะนำให้ฉันรู้วิธีการใช้เชลล์สคริปต์สำหรับดึงข้อมูลฉันใช้ rsync

ขอบคุณ Arn


คุณช่วยแบ่งปันคำสั่ง rsync ได้ไหม? ทำให้ข้อมูลที่สำคัญสับสนถ้ามี
SΛLVΘ

ณ ตอนนี้ฉันใช้ 'rsync -avhe "ssh -p $ portno" --exclude = "/ D / * / data1" --exclude-from = "$ FileNameList" --progress --log-file = " $ LogFullPath "$ User \ @ $ ServerIP: $ FolderPath1 $ InputFolderPath1 ' แต่มันไม่มีตรรกะที่จำเป็น ฉันสามารถรับเวลาเริ่มต้น / สิ้นสุดเวลาได้โดยใช้คำสั่งด้านล่าง cd ~ / Downloads / development / 20151101 find -maxdepth 2 -name "* .gz" | awk -F _ '{พิมพ์ $ 3}' & gt; & gt; $ {LogFullPath} แต่ฉันไม่สามารถเรียกไฟล์ตามเวลาเริ่มต้นหลังจากเปรียบเทียบกับการประทับเวลาปัจจุบัน
Arn

ใน awk ดีกว่า print $3,$4, $0 ดังนั้นเมื่อคุณแยกวิเคราะห์คุณจะมีชื่อเต็มในคอลัมน์ที่สอง คุณต้องการ $4 เช่นกันหากมันเริ่มต้นมานานและสิ้นสุดลงเพียงไม่กี่นาที
Hastur

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

ทำสคริปต์เล็กน้อย เมื่อคุณทำรายการไฟล์ / เส้นทางคุณสามารถแยกวิเคราะห์ได้ภายในไม่กี่วินาที ในทุบตีเมื่อคุณใส่ชื่อไฟล์ (จำ basename ) ในตัวแปรเช่น fnameกับ a=${fname#*_*_} คุณเลือก 20151105173030_20151105173240_1234.log.gz กับ b=${a%_*_*} คุณหดมันลงไป 20151105173030 กับ year=${b:0:4} คุณมี 2015 และอื่น ๆ ... แน่นอนคุณสามารถหาวิธีที่สะดวกสบายมากขึ้น ... การจัดการสตริงทุบตี
Hastur

คำตอบ:


1

คุณสามารถใช้ --include และ --exclude ตัวเลือกสำหรับ rsync เพื่อเลือกเฉพาะไฟล์ที่คุณต้องการ หากฉันเข้าใจคำถามของคุณถูกต้องคุณต้องการไฟล์ที่ชื่อมีวันที่ / เวลาปัจจุบันบวกหรือลบ 15 นาที ไม่แน่ใจว่าคุณต้องการ อย่างแน่นอน 15 นาที แต่นี่เป็นสคริปต์เล็กน้อยที่สามารถทำได้:

#!/bin/sh

format='%Y%m%d%H%M'

for delta in $(seq -15 15); do
    p='--include=*_'$(date +$format --date "+ $delta minutes")'*_*.gz'
    include="$include $p"
done

rsync -av $include --exclude=* SRC/ DEST/

ควรแก้ไขให้ง่าย อย่างแน่นอน 15 นาที.


ใช่เควินคุณพูดถูก ฉันต้องดึงข้อมูลเหล่านั้นเท่านั้นซึ่งมีเวลาเริ่มต้น & lt; 15 นาทีจากการประทับเวลาปัจจุบัน เพิ่มด้วยที่ฉันต้องดึงไฟล์เหล่านั้นจากหลายโฟลเดอร์ย่อยและโครงสร้างโฟลเดอร์ปลายทางต้นทางควรซิงค์ ฉันจะใช้รหัสของคุณ .. ขอบคุณอีกครั้ง
Arn

สวัสดีเควินฉันกำลังพยายามใช้รหัสของคุณ แต่ไม่สามารถรวมไฟล์ที่ต้องการที่สร้างขึ้นใน 15 นาทีที่ผ่านมาได้ format = '% Y% m% d% H% M' สำหรับ delta ใน $ (seq -15 0); ทำ p = '- รวม = " _ '$ (วันที่ + รูปแบบ $ - วันที่ "+ $ delta นาที")' _ .sig.gz "'รวม =" $ รวม $ p "ทำ rsync -avhe" ssh -p $ portno "--exclude-from =" $ Et "$ รวม --exclude =" "--progress --log-file =" $ LogFullPath "$ S1User \ @ $ S1IP: $ S1FP1 $ InpFP1. ฉันกำลังพยายามดึงไฟล์. sig.gz จากพา ธ ND / B1 / a1 ของเซิร์ฟเวอร์ระยะไกล (NE7_08_20151108082030_201580808082_1) sig.gz) และต้องการทำซ้ำเหมือนกันในเซิร์ฟเวอร์ท้องถิ่นคุณควรแนะนำ
Arn

คุณต้องเพิ่มสัญลักษณ์แทน * ไปยัง include และ exclude ตัวเลือกในคำตอบของฉัน p='--include="*_'$(date +$format --date "+ $delta minutes")'*_*.sig.gz"' และ --exclude='*' ฉันก็ไม่รู้เหมือนกัน $Et คือ แต่ควรเป็นไฟล์ที่มีรายการรูปแบบที่ยกเว้น
gogators

สวัสดีเควินฉันใช้สัญลักษณ์แทนแบบเดียวกับที่คุณพูดถึงแม้ว่ามันจะไม่ได้รับการสะท้อนที่นี่ใช่ตามที่คุณพูดว่า "$ Et" มีรายการโฟลเดอร์ย่อยที่ควรแยกออกในเวลาที่ดึงข้อมูล แต่เมื่อใดก็ตามที่ฉันกำลังเพิ่ม $ include และ --exclude = " "มันไม่ได้ดึงข้อมูลอะไรเลย แต่ตอนนี้ฉันสามารถเข้าใจปัญหาได้แล้วเนื่องจากฉันได้กล่าวถึงการยกเว้นแล้ว" "มันไม่สนใจไดเรกทอรีและไม่พยายามตรวจสอบว่าเป็นรูปแบบเนื้อหา / การตั้งชื่อตอนนี้ฉันได้เพิ่ม include =" * / "เพื่อรวมไดเรกทอรีและใช้งานได้ขอบคุณมากสำหรับอินพุตที่มีค่า
Arn

0

หากคุณสามารถเชื่อถือข้อมูลจาก ระบบแฟ้ม คุณสามารถใช้ได้ find และ rsync ด้วยกัน.

find /path -file -mmin +15 -exec rsync {} destination \;

หรือด้วยตรรกะย้อนกลับและมีเพียงหนึ่งเดียว rsync กระบวนการ

rsync --files-from=<(find /path -mmin +3 -type f -exec basename {} \;) /src_path/ /dst_path

การอ้างอิง

คุณสามารถดู [คำตอบ] นี้ [ 1 , 2 , 3 ], ตัวอย่างเช่น...


ขอบคุณ Hastur สำหรับการตอบกลับที่รวดเร็ว แต่ปัญหาคือฉันไม่สามารถพิจารณาข้อมูลก่อนหน้านี้ 15 นาทีตามการประทับเวลาได้ อาจมีบางสถานการณ์ที่การประทับเวลาของไฟล์อาจแตกต่างจากเวลาเริ่มต้น / สิ้นสุด ดังนั้นฉันต้องเปรียบเทียบชื่อไฟล์บางส่วน (เวลาสิ้นสุด / เวลาเริ่มต้น) กับ TS ปัจจุบันแล้วดึงไฟล์นั้นจากเซิร์ฟเวอร์ระยะไกล
Arn

ไม่เป็นไร ดังนั้นคุณควรพยายามทำ วิ่งแบบแห้ง ของ rsync -nหรือดีกว่าง่าย ssh ls /my/src_pathเมื่อต้องการแยกวิเคราะห์ผลลัพธ์ sed 's/_/ /g' จำเป็นสร้างรายการตัวกรอง (อาจแทน awk หรือ bash string) และเรียกใช้เป็นครั้งที่สอง rsync กับที่หนึ่ง
Hastur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.