गलती से नाम / बिन मदद!


39

मेरे पास एक आपातकालीन, लिनक्स और बैश शुरुआत है और कुछ फ़ाइलों का नाम बदलने के लिए एक स्क्रिप्ट लिखने की कोशिश कर रहा है। पाश गलती से पथ (डेस्कटॉप में एक फ़ोल्डर में स्क्रिप्ट चलाने पर) ऊपर चला गया और नाम दिया /binकरने के लिए /D_bin( D_उपसर्ग मैं जोड़ा था) तो अब इस प्रणाली का उपयोग नहीं कर सकते हैं /binसामग्री, इसलिए कोई bash, कोई mvनाम बदलने के लिए, कोई sudo... फ़ाइलें में /D_binठीक है, का नाम बदला नहीं हैं, और कर सकते हैं उन्हें कॉपी-पेस्ट नहीं बल्कि फ़ोल्डर बना सकते हैं /binबैश बिना फिर से। सिस्टम स्थिर है, लेकिन बहुत कम चीजें काम करती हैं और डेस्कटॉप में फ़ाइलों तक पहुंच नहीं है।

/जैसे अन्य फ़ोल्डर /lib /sbin /etcभी ठीक लग रहे हैं, और चित्रमय डेस्कटॉप अभी भी है। मैं पुनः आरंभ करने से डरता हूं क्योंकि मुझे नहीं पता कि यह बूट करने में सक्षम होगा या नहीं।

क्या जड़ में एक खोल है या /D_binवापस नाम बदलने का एक तरीका है /bin? कृपया मदद की जरूरत है, बहुत महत्वपूर्ण काम से समझौता किया

मेरी आत्मघाती स्क्रिप्ट: $:

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
    cd $j
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
    cd ..
done

:( धन्यवाद!!!!


7
आप इस प्रकार की चीज़ों को आज़माने और जानने के लिए VM का उपयोग करने का प्रयास कर सकते हैं, ताकि आप कभी भी अधिक जोखिम न उठाएं।
एम। बेसेरा

7
अब समस्या को ठीक करने के लिए, आप उबंटू के साथ एक बूट करने योग्य यूएसबी बना सकते हैं जैसे कि आप ओएस को स्थापित करना चाहते हैं और कोशिश करें उबंटू को दबाएं , वहां से आप एक टर्मिनल खोल सकते हैं और फ़ोल्डर का नाम बदल सकते हैं।
एम। बेसेरा


32
/D_bin/mv -T /D_bin /binऔर अगली बार रूट के रूप में अपनी स्क्रिप्ट न चलाएं।
जेसन सी

5
Btw जब इस तरह की स्क्रिप्ट बनाते हैं, तो मैं आमतौर पर स्क्रिप्ट चलाने से पहले एक सूखी रन करता हूं, संभावित रूप से विनाशकारी आदेशों को चलाने के बजाय और यह सत्यापित करने के लिए कि इसकी क्रियाएं समझदार होंगी। इसके अलावा: नियमित बैकअप।
जेसन सी

जवाबों:


89

इस समस्या को ठीक करने के कई तरीके हैं।

यदि आपके पास शेल (कोई भी खुला टर्मिनल) है, तो दौड़ें:

sudo /D_bin/mv -T /D_bin /bin

sudoमें है, /usr/binइसलिए इसे पूर्ण पथ के साथ चलाने की कोई आवश्यकता नहीं है।

दूसरी चीज़ जो आप कर सकते हैं, वह /D_binहै अपने PATHपर्यावरण चर को इस तरह जोड़ना :

export PATH=$PATH:/D_bin

यदि आपके पास किसी भी शेल का उपयोग नहीं है:

  1. सिस्टम को रिबूट करें
  2. जब ग्रब ग्रब eको संपादित करने के लिए प्रेस दिखाई देता है
  3. लाइन के अंत में जो लाइनक्स से शुरू होता है, जोड़ें:

    init=/D_bin/bash
  4. दबाएँ CTRL+x

अब आपको बैश शेल में गिरा दिया जाएगा, आपको फ़ाइल सिस्टम को रीड और राइट करने योग्य बनाना चाहिए।

/D_bin/mount -o remount,rw /

और D_bin निर्देशिका को बिन में ले जाएँ:

/D_bin/mv -T /D_bin /bin

फिर सिस्टम को रिबूट करें।

यह काम करना चाहिए, लेकिन अगर आपके लिए कुछ भी काम नहीं किया गया है, तो आप अभी भी सिस्टम को लाइव ubuntu डिस्क / यूएसबी के साथ बूट कर सकते हैं और समस्या को ठीक कर सकते हैं।


2
पहले वाले ने इसे हल किया। बहुत बहुत धन्यवाद, वास्तव में मेरा दिन बचा। जिज्ञासा से बाहर, स्क्रिप्ट देखकर नाम बदलने / बिन तक क्यों पहुंचे? डेस्कटॉप के सभी फ़ोल्डरों को '_D' मिला, लेकिन घर पर या बिन के अलावा किसी और रूट पर नहीं।
कार्लोस डी। ज़पाटा

9
@ CarlosD.Zapata: यदि आपको किसी स्क्रिप्ट में निर्देशिका को लूप में बदलने की आवश्यकता है, तो कोड को उप-शील्ड में चलाना अक्सर एक अच्छा विचार होता है। cd "$j"( पहले नाम दोहरे उद्धरण चिह्नों में होना चाहिए) से पहले एक खुला कोष्ठक जोड़ें , और शरारत बनाने की जगह cd ..मिलान करीबी कोष्ठक के साथ करें। इसके अलावा, आप रूट के रूप में क्यों चल रहे थे। तुम इतना नुकसान करने में सक्षम नहीं होना चाहिए।
जोनाथन लेफ़लर

3
@ CarlosD.Zapata: आपके द्वारा cd ..पुट लगाने के बाद pwd, findस्क्रिप्ट से अपनी कमांड हटाएं , फिर इसे एक सामान्य उपयोगकर्ता के रूप में चलाएं। आप देखेंगे कि स्क्रिप्ट में जाता है /, क्योंकि आप एक सीडी $ j करते हैं जो मुझे लगता है कि फाइलें निर्देशिका नहीं हैं। इसलिए प्रत्येक लूप में आप एक कदम पीछे जाते हैं और अंत में आप अंदर होते हैं /
रवेक्सिना

1
@ CarlosD.Zapata ध्यान रखें कि यह "बंद" हो सकता है /binक्योंकि यह फ़ोल्डर के अंदर काम कर रहा था /bin। मैं उन (हालांकि रूट के रूप में नहीं!) की
जाँच करूंगा

17
यह शायद / बिन पर बंद हो गया क्योंकि / बिन में पहला फ़ोल्डर था / कि यह नाम बदलने के लिए हुआ (यह वर्णानुक्रम में पहले है), और उसके बाद, यह mvकिसी भी अधिक नहीं चल सका ।
user253751

8

इस समस्या को ठीक करने के लिए यदि आपके पास कोई रनिंग टर्मिनल खुला नहीं है, तो मैं सबसे पहले "शेल विकल्प" खोजने की कोशिश करूंगा जिसे आप बैश के बजाय उपयोग कर सकते हैं। पायथन में है /usr/bin, इसलिए अभी भी काम करना चाहिए।

Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call(["sudo", "/D_bin/mv", "-T", "/D_bin", "/bin"])

यदि वह काम नहीं करता है, तो मैं लाइव सीडी / यूएसबी से सीधे बूट करूंगा और एक ज्ञात-चलने वाले वातावरण से सब कुछ ठीक करूंगा।

एक सामान्य सलाह के रूप में, मैं टिप्पणियों में जोनाथन लेफ़लर को छोड़ दूंगा: cd ..लिपियों में कभी भी इसका उपयोग न करें , यह आसानी से ऐसी समस्याओं को जन्म दे सकता है। बेहतर में केवल सीडी $jएक के भीतर निर्देशिका subshell , इस तरह से तुम वापस करने के बारे में चिंता करने की ज़रूरत नहीं है।

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
  (
    cd "$j"
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
  )
done

इसके अलावा, निश्चित रूप से, जब तक बिल्कुल आवश्यक न हो, तब तक जड़ के रूप में सामान न चलाएं।


क्या किसी अन्य शेल / टर्मिनल तक पहुंच के बिना अजगर की तरह इंटरेक्टिव शेल चलाना संभव है? मुझे लगता है कि वर्कअराउंड को एक ऐसी स्क्रिप्ट बनानी चाहिए, जिसमें रूट के रूप में चलाने के लिए पासवर्ड के साथ कमांड भी हो। जीयूआई मैं अनुमान लगाता हूं।
रवेक्सिना

@ रेवेक्सिना: सब कुछ एक शेल की जरूरत नहीं कर सकताpythonप्रक्रिया को चलाने के लिए सुनिश्चित करें कि आपको बस एक टर्मिनल एप्लिकेशन की आवश्यकता है, और os.system("sudo ...")आपको चलाने के लिए बस एक * निक्स कर्नेल की आवश्यकता है। हो सकता है कि मैं इसे वीएम में बाद में
आज़माऊंगा

इसके अलावा, जब cdलिपियों में आईएनजी, तो आमतौर पर cd -वापस उसी स्थान पर जाना बेहतर होता है जहां आप एक निर्देशिका को नीचे ले जाने के बजाय यह मानते हैं। यदि आप प्रारंभिक परिवर्तन करते हैं cd, तो cd ..आपको वह स्थान वापस नहीं मिलेगा जहाँ आप थे, लेकिन cd -होगा।
Frambot

@JoeFrambach जैसे cd ..मैं लिपियों में उपयोग नहीं करूंगा cd -, केवल कमांड-लाइन पर। cd -शायद किसी मुसीबत-गारंटी से कम है cd .., लेकिन मैं अभी भी इसे सुरक्षित नहीं मानूंगा - अगर कोई बीच में आगे की निर्देशिका में बदलाव करता है, तो यह आपको अनजाने में कहीं ले जाएगा। जहां सबस्क्रिप्शन आपको स्पष्ट रूप से सीमांकित गुंजाइश देता है कि निर्देशिका कहां बदलती है, और आप किस बिंदु पर वापस जाते हैं।

@ रेवेक्सिना मैंने अभी इसकी कोशिश की: पायथन वास्तव में लॉन्च किया जा सकता है। इसके बिना काम नहींos.system चलता है , लेकिन काम करता है। shsubprocess.call
लेफ्टरनैबाउट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.