जो फाइलें लिखी जा रही हैं उन्हें छोड़कर किसी फोल्डर की सभी फाइलों को कॉपी कैसे करें?


12

मैं HTTPie केdownloading माध्यम से एक फ़ोल्डर में कई फाइलें डाउनलोड करता हूं । एक बैश स्क्रिप्ट का उद्देश्य डाउनलोड की गई फ़ाइलों को संसाधित करना है, और मैंने डाउनलोड की गई फ़ाइलों को किसी अन्य फ़ोल्डर में कॉपी करने की कोशिश की

find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;

लेकिन यह उन फ़ाइलों को भी कॉपी करता है, जो अभी तक समाप्त नहीं हुई हैं। मैंने -mmin +5आदेश में जोड़कर पुरानी फ़ाइलों में स्थानांतरण को सीमित करने का प्रयास किया । फ़ाइलों को छोड़ने के लिए कुशल कमांड क्या लिखा जा रहा है और डाउनलोड की गई फ़ाइलों को ही ट्रांसफर किया जा रहा है?


यदि एक ही फाइल सिस्टम में कॉपी किया जाता है, और आप डाउनलोडर का नाम बदलने के लिए सेट करते हैं (डाउनलोड करने के लिए %.partफिर से नाम बदलकर%)। फिर यदि डाउनलोडर अच्छी तरह से व्यवहार करता है (कुछ और अजीब नहीं है), तो आपको mvफ़ाइलों का नाम बदलने में सक्षम होना चाहिए ।
ctrl-alt-delor

1
आप किस तरह की प्रोसेसिंग करने की कोशिश कर रहे हैं? एक पाइप लाइन का उपयोग करने की तरह बहुत अधिक सरल विकल्प उपलब्ध होने की संभावना है।
गार्डेनहेड

जवाबों:


11

बहुत कुशल नहीं है, लेकिन आप ऐसा कर सकते हैं:

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 mving।

आमतौर पर लिनक्स-आधारित ऑपरेटिंग सिस्टम पर पाया जाने वाला 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()जो फ़ाइल डिस्क्रिप्टर के माध्यम से नहीं किया जा सकता है)।


शैल प्रश्न: मुझे लगता है कि मैं एक अपवाद के साथ आपके कोड को समझता हूं। -execचल रहा है shएक आदेश (साथ -c '...') और {} +यह एक समय में है कि आदेश में एक से अधिक परिणाम डाल करने के लिए कहता है। मुझे समझ में नहीं आता है कि shकमान के बाद एक और क्यों है । मैं क्या खो रहा हूँ?
जो

2
@ जो, यह इनलाइन-स्क्रिप्ट में जाता है $0। यही है, यह उस इनलाइन स्क्रिप्ट को एक नाम देता है । <name>: fuser: command not foundउदाहरण के लिए त्रुटि संदेशों में उस नाम का उपयोग किया जा सकता है , इसलिए shइस मामले में आम तौर पर एक अच्छा विकल्प है यह स्पष्ट करने के लिए कि त्रुटि संदेश क्या रिपोर्ट कर रहा है (यह भी वही होगा यदि हम किसी भी तर्क को बिल्कुल भी नहीं देते हैं। इनलाइन स्क्रिप्ट)।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.