ใช้ inotifywait เพื่อย้ายไฟล์เมื่อโหลดในโฟลเดอร์ดรอปบ็อกซ์


12

ฉันกำลังพยายามหาวิธีย้ายไฟล์ไปยังโฟลเดอร์อื่นทันทีที่ปรากฏในดรอปบ็อกซ์ของฉันบน CentOS

ฉันขัดจังหวะอินเทอร์เน็ตเพื่อหาเบาะแส แต่ฉันไม่สามารถไปไกลเกินกว่าความจริงที่ว่าฉันต้องใช้inotifyเพื่อเรียกใช้สคริปต์ซึ่งจะประมวลผลไฟล์ตามที่ปรากฏ

ความรู้ BASH ของฉันมี จำกัด มากและฉันสงสัยว่าฉันสามารถเขียนสิ่งนี้ใน PHP

กล่าวอีกนัยหนึ่งฉันจะย้ายไฟล์ไปยังโฟลเดอร์อื่นทันทีที่ใช้งานได้inotifyอย่างไร


ชื่อของไฟล์สามารถคาดเดาได้อย่างต่อเนื่องหรือไม่? หรือเป็นที่ตั้ง? รายละเอียดเพิ่มเติมจะเป็นประโยชน์ ...
jasonwryan

@jasonwryan เป็นโฟลเดอร์ดรอปบ็อกซ์ดังนั้นตำแหน่งจึงสอดคล้องกัน และนำไปใช้กับไฟล์ใด ๆ ที่ลดลงในโฟลเดอร์นั้น
Ortix92

คำตอบ:


13

นี่เป็นวิธีง่าย ๆ :

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

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


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

2
การฟังcreateเหตุการณ์ไม่ถูกต้องเนื่องจากคุณจะทำmvไฟล์ที่อาจไม่สามารถคัดลอกลงดิสก์ได้อย่างสมบูรณ์ ดูคำตอบ @Gilles โดยใช้close_writeกิจกรรมแทน
fduff

3
@fduff เห็นคำตอบ Gilles เป็นเสมอสิ่งที่ถูกต้องที่จะทำ ...
jasonwryan

17

คำสั่งinotifywaitพิมพ์ข้อความทุกครั้งที่เนื้อหาของไดเรกทอรีที่ระบุมีการเปลี่ยนแปลง คุณจะต้องเลือกเหตุการณ์ที่ถูกต้อง: ไม่ใช่เมื่อสร้างไฟล์ แต่เมื่อ Dropbox ดาวน์โหลดเสร็จแล้ว ฉันไม่รู้ว่า Dropbox ทำงานอย่างไร หากมันเขียนไปยังไฟล์ในตำแหน่งสุดท้ายให้ฟังclose_writeเหตุการณ์ หากมันเขียนไปยังไฟล์ไปยังตำแหน่งชั่วคราวแล้วย้ายไปไว้ที่อื่นให้ฟังmoved_toเหตุการณ์ ผ่านตัวเลือก-m -qเพื่อinotifywaitให้คอยรับฟังเหตุการณ์ (โดยค่าเริ่มต้นจะรอเฉพาะเหตุการณ์ถัดไป) และพิมพ์ข้อความที่เกี่ยวข้องเท่านั้น

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done

1
สิ่งนี้ล้มเหลวสำหรับไฟล์ที่มีบรรทัดใหม่ในชื่อของพวกเขา ฉันไม่สามารถหาวิธีที่จะมีinotifywaitชื่อไฟล์ที่ลงท้ายด้วย null ได้ ที่ดีที่สุดของฉันจะทำคือการใช้ตัวอักษรที่มีแนวโน้มน้อยกว่าขึ้นบรรทัดใหม่ตัวอย่าง%f$'\001'และการใช้งาน-d $'\001'ด้วยหรือwhile IFS= read -r xargs
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
@DennisWilliamson ใช่inotifywaitเป็นวิธีที่น่ารำคาญ คุณสามารถใช้สิ่งที่ชอบ//%fได้เนื่องจากชื่อไฟล์จะไม่มีเครื่องหมายทับสองครั้งตราบใดที่เส้นทางดูไม่มี แล้วความน่ารำคาญก็คือที่ด้านการแยกวิเคราะห์
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.