बहुत कुशल नहीं है, लेकिन आप ऐसा कर सकते हैं:
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
से पहले Iles m
ओ v
ing।
आमतौर पर लिनक्स-आधारित ऑपरेटिंग सिस्टम पर पाया जाने वाला psmisc
कार्यान्वयन fuser
एक -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
) यदि आप यह देखना चाहते हैं कि क्या प्रक्रिया (तों) कदम को रोक रही है (हैं)।
ध्यान दें कि यदि आप उन आदेशों को सुपर-उपयोगकर्ता के रूप में नहीं चला रहे हैं, तो आप केवल अपनी प्रक्रियाओं के बारे में जानकारी प्राप्त करेंगे। यदि फ़ाइलों को डाउनलोड करने की प्रक्रिया एक अलग उपयोगकर्ता के रूप में चल रही है, तो वे अनडेट रहेंगे।
यह भी ध्यान दें कि जब तक आप फ़ाइलों को किसी भिन्न फ़ाइल सिस्टम पर नहीं ले जा रहे हैं, तब तक फ़ाइलें स्थानांतरित करने से जो भी प्रक्रिया वर्तमान में फ़ाइल को लिखने से परिष्करण करने के लिए लिख रही है उसे रोक नहीं पाएगी।
हालाँकि, बाद में वे क्या करने के लिए डिज़ाइन किए गए हैं, इस पर निर्भर करते हुए कि वे लिखना समाप्त करने के बाद भ्रमित हो सकते हैं, फ़ाइल अब नहीं है (उदाहरण के लिए यदि वे डाउनलोड करने के बाद फ़ाइल की कुछ विशेषताओं को बदलना चाहते हैं और ऐसा नहीं करते हैं फ़ाइल डिस्क्रिप्टर के माध्यम से (जैसे chmod()
बनाम fchmod()
, या utimes()
जो फ़ाइल डिस्क्रिप्टर के माध्यम से नहीं किया जा सकता है)।
%.part
फिर से नाम बदलकर%)। फिर यदि डाउनलोडर अच्छी तरह से व्यवहार करता है (कुछ और अजीब नहीं है), तो आपकोmv
फ़ाइलों का नाम बदलने में सक्षम होना चाहिए ।