एक पाश में एमवी और पैरामीटर प्रतिस्थापन का उपयोग करने के बाद गायब फाइलें


1

mvमेरे प्रश्न का उत्तर न देने के बाद गुम फाइलों से संबंधित प्रश्न। निम्न निर्देश कार्य निर्देशिका के भीतर चलाए गए थे जहाँ फ़ाइलें स्थित होती हैं, जिसके परिणामस्वरूप फ़ाइलें गुम हो जाती हैं।


चरण 1

मैं फ़ाइल नाम का एक क्रमबद्ध सरणी है $layersके साथ बनाया layers=$(ls cropped* | sort -nk1.9):

IFS=$'\n';for file in $layers; do echo $file; done  
cropped_1.png  
cropped_2-a.png  
cropped_2-b.png    
cropped_2.png  
cropped_3-a.png  
cropped_3-b.png  
cropped_3.png  
cropped_4-a.png  
cropped_4-b.png  
cropped_4-c.png  
cropped_4-d.png  
cropped_4-e.png  
cropped_4-f.png  
cropped_4-g.png  
cropped_4.png  
cropped_5-a.png  
cropped_5-b.png  
cropped_5.png  
--More--

चरण 2

मैंने प्रत्येक फ़ाइल नाम में _ के बाद सब कुछ बदलने के लिए निम्न लूप चलाया:

i=1;IFS=$'\n';for file in $layers; do echo ${file/#*_*/cropped_$((i++)).png}; done  
cropped_1.png
cropped_2.png
cropped_3.png
cropped_4.png
cropped_5.png
cropped_6.png
cropped_7.png
cropped_8.png
cropped_9.png
cropped_10.png
cropped_11.png
cropped_12.png
cropped_13.png
cropped_14.png
cropped_15.png
cropped_16.png
cropped_17.png
--More--

चरण 3 - खतरे, रॉबिन्सन!

यह अब तक अच्छा लग रहा था। इसलिए मैं के साथ एक फ़ाइल का नाम बदलने की कोशिश की mvनिम्नलिखित पाश है, जो मैं कुछ में परिणाम होगा उम्मीद का उपयोग कर की तरह mv cropped_2-a.png cropped_2.pngहै, तो mv cropped_2-b.png cropped_3.png, और इतने पर:

i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done

इसने पहली फ़ाइल के लिए एक त्रुटि दी।

mv: 'cropped_1.png' और 'cropped_1.png' एक ही फाइल हैं

मुझे लगा कि यह प्रत्येक फ़ाइल नाम के लिए यह त्रुटि देगा जहाँ mv SOURCE DESTमिलान किया गया। इसके बजाय, यह केवल लूप में पहली फ़ाइल पर त्रुटि देता है।

अजीब बात यह है कि कई फाइलें अब गायब हैं। केवल शेष फाइलें इस प्रकार हैं:

ls cropped* | sort -nk1.9
cropped_1.png
cropped_141.png
cropped_142.png
cropped_143.png
cropped_144.png
cropped_145.png
cropped_146.png
cropped_147.png
cropped_148.png
cropped_149.png
cropped_150.png
cropped_151.png
cropped_152.png
cropped_153.png
cropped_154.png
cropped_155.png

सवाल

गुम हुई फाइलें कहां चली गईं?

इससे पहले कि मैं कुछ नामों के साथ कुछ डुप्लिकेट बनाता जैसे 140 फाइलें थीं, cropped_2-a.pngजिसके परिणामस्वरूप कुल 155 फाइलें थीं। यदि फाइलें 141-155 सफलतापूर्वक चली गईं, तो फाइलें 2-140 कहां हैं? वे अपेक्षित गंतव्य की ओर क्यों नहीं बढ़ रहे हैं; वर्तमान काम कर निर्देशिका?


टिप्पणियाँ

यदि मैं ऐसे नामों के साथ फाइल नहीं जोड़ता हूं cropped_2-a.png, तो लूप प्रत्येक फ़ाइल के लिए त्रुटि संदेश प्रदर्शित करेगा और फाइलें अपरिवर्तित रहेंगी:

i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done
mv: cropped_1.png and cropped_1.png are the same file
mv: cropped_2.png and cropped_2.png are the same file
mv: cropped_3.png and cropped_3.png are the same file
mv: cropped_4.png and cropped_4.png are the same file
mv: cropped_5.png and cropped_5.png are the same file
--More--

मैंने फ़ाइल नामों के साथ परीक्षण किया है जैसे cropped_2a.png(नहीं -) और यह लापता फ़ाइलों की समस्या को दोहराता है।

जब मैं mv -vयह देखने की कोशिश करता हूं कि क्या चल रहा है, तो यह उम्मीद के मुताबिक फाइलों का नाम बदल रहा है, फिर भी जब मैं जांच करता हूं, तो फाइलें गायब होती हैं। दोहरे उद्धरण चिह्नों में पैरामीटर प्रतिस्थापन 1 ${file/#*_*/cropped_$((i++)).png} को लपेटने से यह हल नहीं होता है।

i=1;IFS=$'\n';for file in $layers; do mv -v $file "${file/#*_*/cropped_$((i++)).png}"; done
cropped_2-a.png -> cropped_2.png
cropped_2-b.png -> cropped_3.png
cropped_2.png -> cropped_4.png
cropped_3-a.png -> cropped_5.png
cropped_3-b.png -> cropped_6.png
cropped_3.png -> cropped_7.png
cropped_4.png -> cropped_8.png
cropped_5.png -> cropped_9.png
cropped_6.png -> cropped_10.png
--More--

mvविस्मरण तर्क काम करता है के रूप में पैरामीटर प्रतिस्थापन का उपयोग कर एक सरल आदेश का परीक्षण :

testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_999.png}

यह भी काम करता है:

i=998
testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}

'cropped_2-b.png' -> 'cropped_998.png'

testy="cropped_3-a.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}

'cropped_3-a.png' -> 'cropped_999.png'

मैं यह निर्धारित करने में सक्षम नहीं हूं कि एक ही फाइल त्रुटि प्रदर्शित होने के बाद लूप के लिए यह विफल क्यों हो जाता है या जहां फाइलें वास्तव में जाती हैं।

जवाबों:


2

cropped_2-a.pngका नाम बदल दिया गया cropped_2.png। इसने मूल को बदल दिया cropped_2.png। फिर 2 पंक्तियों के बाद इस फ़ाइल का नाम बदल दिया गया cropped_4.png

इस समस्या से बचने का सबसे अच्छा तरीका यह है कि आप फ़ाइलों को एक अलग, शुरू में खाली, निर्देशिका में स्थानांतरित करें, जब आप उनका नाम बदल रहे हों, तो आपको पुराने नामों के साथ संघर्ष करने वाले किसी भी नए नाम के बारे में चिंता करने की ज़रूरत नहीं है। फिर जब लूप किया जाता है तो आप नामांकित फ़ाइलों को मूल निर्देशिका में वापस ले जा सकते हैं।


ओह मैं देख रहा हूं, यह बार-बार फाइलों को इस तरह से ओवरराइट कर रहा है। आँखों के दूसरे सेट के लिए धन्यवाद। आसानी से i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/./final/cropped_$((i++)).png}; donehahaha मैं मदद नहीं कर सकता, लेकिन इस पर हंसी के साथ एक नई अवधि के लिए ले जाया गया ।
आइरिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.