ไม่มีประสิทธิภาพมาก แต่คุณสามารถทำได้:
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
นั่นคือการตรวจสอบว่าไฟล์ไม่ได้อยู่กับw
พระราชพิธีa
โหมด ccess ในl
ฉันs
ทีของo
ปากกาf
ไมล์ก่อนm
o v
ไอเอ็นจี
การpsmisc
ใช้งานfuser
ตามปกติที่พบในระบบปฏิบัติการที่ใช้ Linux มี-w
ฟังก์ชั่น (เพื่อตรวจสอบไฟล์ที่เปิดสำหรับการเขียน) แต่น่าเสียดายที่มันทำงานร่วมกับ-k
เพื่อฆ่ากระบวนการที่สอดคล้องกันเท่านั้น อย่างไรก็ตามดูเหมือนว่าคุณยังสามารถใช้งานได้โดยใช้สัญญาณหลอก 0 ที่ไม่ทำสิ่งใดเลย:
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
ลบ-s
(หรือแทนที่ด้วย-v
) หากคุณต้องการดูว่ากระบวนการใดที่ป้องกันการย้าย
โปรดทราบว่าหากคุณไม่ได้ใช้คำสั่งเหล่านั้นในฐานะผู้ใช้ขั้นสูงคุณจะได้รับข้อมูลเกี่ยวกับกระบวนการของคุณเท่านั้น หากกระบวนการดาวน์โหลดไฟล์กำลังทำงานในฐานะผู้ใช้คนอื่นกระบวนการเหล่านั้นจะยังคงไม่ถูกตรวจจับ
นอกจากนี้โปรดทราบว่าหากคุณไม่ย้ายไฟล์ไปยังระบบไฟล์ที่แตกต่างกันการย้ายไฟล์จะไม่ป้องกันกระบวนการใดก็ตามที่กำลังเขียนไปยังไฟล์ไม่ให้ทำการเขียนลงไฟล์
อย่างไรก็ตามขึ้นอยู่กับสิ่งที่พวกเขาได้รับการออกแบบให้ทำหลังจากนั้นพวกเขาอาจจะสับสนถ้าหลังจากเขียนเสร็จแล้วไฟล์จะไม่อยู่ที่นั่นอีกต่อไป (ตัวอย่างเช่นหากพวกเขาต้องการเปลี่ยนคุณลักษณะบางอย่างของไฟล์หลังจากดาวน์โหลดและไม่ผ่าน file descriptor (เช่นchmod()
vs fchmod()
หรือutimes()
ซึ่งไม่สามารถทำได้ผ่าน file descriptor)
%.part
แล้วเปลี่ยนชื่อเป็น%) จากนั้นหากตัวดาวน์โหลดทำงานได้ดี (ไม่ทำอะไรแปลก ๆ ) คุณควรจะสามารถเปลี่ยนชื่อmv
ไฟล์( ) ได้