शेल स्क्रिप्ट में "बहुत सारे तर्क" के साथ असफलता पाते हैं, लेकिन सीधे टर्मिनल में चलाने पर नहीं


3

मेरे पास एक कार्य स्टेशन है जो सुरक्षित रूप से रखने के लिए सर्वर पर अपलोड किए जाने से पहले अस्थायी रूप से छवियों को संग्रहीत करता है। मुझे 3 डी पर दिन में एक बार पुरानी फ़ाइलों को हटाने का शौक है, जो कि लिपि के माध्यम से निर्धारित स्क्रिप्ट का उपयोग कर रहा है।

#!/bin/bash
find /some/directory/with/pictures/* -exec rm -rf {} \+

मैंने इसे एक विकास कार्य केंद्र पर काम करने के लिए सत्यापित किया है जिसमें केवल ~ 250 एमबी चित्र (30 चित्र) हैं।

चूंकि प्रोडक्शन वर्कस्टेशन में यह स्क्रिप्ट नहीं चल रही थी, इसलिए कई सौ गीगाबाइट के ऑर्डर पर उनके पास बहुत सारी छवियां हैं। इसका मतलब यह है कि जब findशेल स्क्रिप्ट के माध्यम से निष्पादित किया जाता है, तो यह रुक जाता है और कहता है "बहुत सारे तर्क।"

मैं (अगर बदलते कोशिश कर xargs, देखकर क्यों पता लगाने की कोशिश में बहुत समय खर्च +करने के लिए ;आदि प्रभावित कुछ भी ...) केवल एक चीज मैं कोशिश नहीं की वास्तव में खोल स्क्रिप्ट के माध्यम से निर्देशिका में जा रहा था पूरी तरह लगता है का उपयोग कर से बचने के लिए। मुझे लगता है कि "बहुत सारे तर्क" समझ में आते हैं - ऐसा लगता है कि तर्कों की संख्या पर एक टोपी है, और मेरे पास एक कार्यस्थान में ~ 33,000 फाइलें हैं जो मैं इस अवधारणा को साबित कर रहा हूं।

मेरे लिए चीजों को और अधिक भ्रमित करने के लिए, find ./ -exec rm -rf {} \;टर्मिनल कार्यों (धीरे) के माध्यम से निर्देशिका के भीतर निष्पादित करना ।

मैंने टर्मिनल का उपयोग करके डिलीट का प्रदर्शन किया है, इसलिए मैं भविष्य में प्रक्रिया के बारे में चिंतित नहीं हूं (यह एक दिन में 33k चित्रों के पास कहीं भी उत्पादन नहीं करेगा), लेकिन मैं जो जानना चाहता हूं वह 33k के साथ टर्मिनल में क्यों find काम करता है तर्क, लेकिन शेल स्क्रिप्ट के भीतर नहीं।


2
आपकी स्क्रिप्ट और निर्देशिका में आप जो निष्पादित करते हैं, वह बिल्कुल समान नहीं हैं, *आपकी स्क्रिप्ट में शेल विस्तार को ट्रिगर किया जा सकता है जो कमांड लाइन की लंबाई सीमा से अधिक हो सकता है।
Mokubai

क्या शेल स्क्रिप्ट लाइन को बदलना find ./some/directory/with/pictures/ -exec rm -rf {} \+बराबर होगा? मैं पहले पुनरावृत्तियों से परेशान था जहाँ मैं फ़ाइलों के साथ फ़ोल्डर भी हटा दूँगा। संपादित करें: यह समकक्ष नहीं है। यह फ़ोल्डर को हटा देता है जैसा कि मुझे उम्मीद थी।
नेस्टरियन

@Nestarion आज़माएं find ./some/directory/with/pictures/ -mindepth 1 -exec rm -rf {} \+(एक परीक्षण निर्देशिका पर, निश्चित रूप से)। -mindepth 1निर्देशिका खुद को हटाने से रोकने चाहिए।
गॉर्डन डेविसन

find ./some/directory/with/pictures/काम नहीं करता है, लेकिन जब -mindepth 1आप प्रस्तावित करते हैं तो अवधि को हटाने से काम होता है । लेकिन यह प्रश्न findमेरे कमांड के सिंटैक्स के बजाय क्यों और कैसे सीमित है (हालांकि यह संबंधित है) के बारे में अधिक था ।
नेस्टरियन

जवाबों:


1

आप * nix "में बहुत सारी फाइलें खोलते हैं " मुद्दा! मैकोस में सीमा होती है कि कितनी फाइलें एक प्रक्रिया है, और सिस्टम एक बार में खुल सकता है। यह ulimitज्यादातर लिनक्स सिस्टम पर Init के साथ इंटरैक्ट करने के तरीके के समान है ।

ये सीमाएँ टर्मिनल के लिए और फाइलसिस्टम-आधारित अनुप्रयोगों के लिए अलग-अलग निर्धारित हैं। प्रत्येक प्रक्रिया की डिफ़ॉल्ट सीमाएं मैकड (तेंदुए या तो) पर लॉन्च से विरासत में मिली हैं, और आप उन्हें उपयोग करके संकलित कर सकते हैंsudo launchctl limit

इस व्यवहार को बदलने के तरीके हैं, जैसे मैक पर अधिकतम सिस्टम संसाधन खपत को लगातार कैसे नियंत्रित करें? , और कौन सी कमांड खुली फ़ाइल सीमा को नियंत्रित करती है?


आपके द्वारा दिए गए लिंक बेहद मददगार हैं। यही वह है जिसकी तलाश में मैं हूं!
नेस्टरियन

1
-1। इस मामले में findभी विस्तार से उत्पन्न फ़ाइलों को नहीं खोलता है *; यह केवल पुष्टि करता है कि वे मौजूद हैं, इस क्रिया के लिए निर्देशिका प्रविष्टियों को पढ़ना आवश्यक है। उपकरण निर्देशिकाओं को खोलता है (यदि कोई हो), लेकिन यह एक-एक करके करता है: यह अगले को खोलने से पहले बंद हो जाता है। rmफ़ाइलें भी नहीं खोलता है, यह उन्हें एक के बाद एक खोल देता है। "बहुत सारे तर्क" "बहुत सारी खुली फाइलें" नहीं हैं।
कामिल मैकियोरोवस्की

@KamilMaciorowski man findमेरे सिस्टम के अनुसार "GNU खोजें निर्देशिका ट्री को खोजता है जो प्रत्येक दिए गए प्रारंभिक बिंदु पर दिए गए प्रारंभिक बिंदु पर बाईं ओर से दाएं अभिव्यक्ति का मूल्यांकन करता है, पूर्ववर्तीता के नियमों के अनुसार (देखें अनुभाग OPERATORS, जब तक कि परिणाम ज्ञात नहीं हो जाता है) बाएं हाथ की ओर और संचालन के लिए, सही है या) के लिए गलत है, जिस बिंदु पर अगले फ़ाइल नाम पर चालें मिलती हैं। " मतलब कि बेस डायर से पूरा पेड़ कमांड के रन के दौरान खुला है (शब्द की कुछ परिभाषा के लिए खुला )।
19

@cawwot findको डायरेक्टरी ट्री सर्च करने के लिए फाइल खोलने की जरूरत नहीं है । ओपी की कमान का कोई भी हिस्सा वास्तव में एक फाइल नहीं खोलता है जो मिल गया है। निष्पादक ( find, rm) को कुछ अतिरिक्त फ़ाइलों के साथ खोलने की आवश्यकता हो सकती है (जैसे पुस्तकालय, लोकेल, ...), लेकिन यह है।
कामिल मैकियोरोस्की

@KamilMaciorowski एक काँटेदार फाइल सिस्टम फ़ाइल में वर्णनकर्ता तरह आदेशों द्वारा खोला हो find, rmआदि Macs HFS (या HFS नए Macs पर +), क्या एप्पल कॉल का उपयोग संसाधन कांटे , जो फाइल सिस्टम आदेशों द्वारा खोले जाते हैं, प्रत्येक फ़ाइल के लिए एक (आम तौर पर) ।
cwwot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.