เปลี่ยนชื่อ / ถังช่วยเหลือโดยไม่ตั้งใจ!


39

ฉันมีกรณีฉุกเฉิน Linux และ Bash ที่นี่และเริ่มพยายามเขียนสคริปต์เพื่อเปลี่ยนชื่อไฟล์บางไฟล์ ห่วงตั้งใจก็ขึ้นไปเส้นทาง (วิ่งสคริปต์ในโฟลเดอร์ในเดสก์ทอป) และเปลี่ยนชื่อ/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 เพื่อลองและเรียนรู้สิ่งนี้ดังนั้นคุณจะไม่ต้องเสี่ยงมากนัก
M. Becerra

7
ตอนนี้เพื่อแก้ไขปัญหาคุณสามารถสร้าง USB ที่สามารถบู๊ตได้กับ Ubuntu ราวกับว่าคุณต้องการติดตั้งระบบปฏิบัติการและกดลอง Ubuntuจากนั้นคุณสามารถเปิดเทอร์มินัลแล้วเปลี่ยนชื่อโฟลเดอร์
M. Becerra


32
/D_bin/mv -T /D_bin /binและอย่าเรียกใช้สคริปต์ของคุณในฐานะ root ในครั้งต่อไป
Jason C

5
Btw เมื่อสร้างสคริปต์เช่นนี้ฉันมักจะทำแห้งก่อนโดยให้สคริปต์สะท้อนคำสั่งที่อาจทำลายล้างแทนที่จะเรียกใช้พวกเขาและตรวจสอบว่าการกระทำของมันจะมีสติ ยัง: สำรองข้อมูลปกติ
Jason C

คำตอบ:


89

มีหลายวิธีในการแก้ไขปัญหานี้

หากคุณมีสิทธิ์เข้าถึงเชลล์ (เทอร์มินัลเปิด) ให้รัน:

sudo /D_bin/mv -T /D_bin /bin

sudoอยู่ใน/usr/binนั้นไม่จำเป็นต้องรันด้วยพา ธ สัมบูรณ์

สิ่งอื่น ๆ ที่คุณสามารถทำได้คือการเพิ่มตัวแปรสภาพแวดล้อม/D_binของคุณPATHเช่นนี้:

export PATH=$PATH:/D_bin

หากคุณไม่มีสิทธิ์เข้าถึงเชลล์:

  1. รีบูทระบบ
  2. เมื่อด้วงปรากฏขึ้นกดeเพื่อแก้ไขด้วง
  3. ที่ส่วนท้ายของบรรทัดที่ขึ้นต้นด้วย linux ให้เพิ่ม:

    init=/D_bin/bash
  4. กดCTRL+x

ตอนนี้คุณจะถูกดร็อปลงใน bash shell คุณควรติดตั้งระบบไฟล์ใหม่เพื่ออ่านและเขียนได้

/D_bin/mount -o remount,rw /

และย้ายไดเรกทอรี D_bin ไปที่ bin:

/D_bin/mv -T /D_bin /bin

จากนั้นรีบูทระบบ

มันควรจะทำงานได้ แต่ถ้าไม่มีอะไรที่เหมาะกับคุณคุณก็ยังสามารถบู๊ตระบบด้วยดิสก์อูบุนตู / usb แบบสดและแก้ไขปัญหาได้


2
คนแรกแก้ไขมัน ขอบคุณมากบันทึกวันของฉันจริงๆ ด้วยความอยากรู้อยากเห็นโดยการดูสคริปต์ทำไมการเปลี่ยนชื่อถึง / bin? โฟลเดอร์ทั้งหมดในเดสก์ท็อปมี '_D' แต่ไม่มีที่อื่นที่บ้านหรือที่รูทยกเว้นช่องเก็บ
Carlos D. Zapata

9
@ CarlosD.Zapata: หากคุณต้องการเปลี่ยนไดเรกทอรีในลูปในสคริปต์ก็มักจะเป็นความคิดที่ดีที่จะเรียกใช้รหัสใน sub-her Will เพิ่มวงเล็บเปิดก่อนหน้าcd "$j"(ชื่อควรอยู่ในเครื่องหมายคำพูดคู่) และแทนที่การสร้างความเสียหายcd ..ด้วยวงเล็บปิดที่ตรงกัน นอกจากนี้ทำไมคุณถึงทำงานเหมือนรูท คุณไม่ควรทำดาเมจมากขนาดนั้น
Jonathan Leffler

3
@ CarlosD.Zapata: หลังจากcd ..ใส่pwdแล้วให้ลบfindคำสั่งของคุณออกจากสคริปต์แล้วเรียกใช้ในฐานะผู้ใช้ปกติ คุณจะเห็นสคริปต์เข้าไป/เพราะคุณทำ cd $ j ซึ่งฉันเดาว่าไฟล์ไม่ใช่ไดเรกทอรี ดังนั้นในแต่ละวงคุณย้อนกลับไปหนึ่งก้าวและในที่สุดคุณก็เข้า/มา
Ravexina

1
@ CarlosD.Zapata เก็บไว้ในใจว่ามันอาจจะมีการ "หยุด" ที่เพราะได้ทำงานในโฟลเดอร์ภายใน/bin /binฉันจะตรวจสอบเหล่านั้น (แม้ว่าจะไม่รูต!)
wizzwizz4

17
มันอาจหยุดบน / bin เพราะ / bin เป็นโฟลเดอร์แรกใน / ที่มันเกิดขึ้นเพื่อเปลี่ยนชื่อ (มันเป็นตัวอักษรแรก) และหลังจากนั้นมันไม่สามารถทำงานได้mvอีก
user253751

8

หากต้องการแก้ไขปัญหานี้หากคุณไม่ได้เปิดเทอร์มินัลเปิดอยู่ฉันจะลองค้นหา“ เชลล์แทน” ที่คุณสามารถใช้แทนการทุบตี Python อยู่ใน/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 / USB โดยตรงและแก้ไขทุกอย่างจากสภาพแวดล้อมที่รู้จักกันดี

ตามคำแนะนำทั่วไปฉันขอให้ Jonathan Leffler เป็นคนที่สองในความคิดเห็น: อย่าใช้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 โดยไม่ต้องเข้าถึงเชลล์ / เทอร์มินัลอื่น ๆ ? ฉันคิดว่าวิธีแก้ปัญหาควรสร้างสคริปต์ที่มีคำสั่งข้างรหัสผ่านเพื่อเรียกใช้เป็นรูต GUI จะทำสิ่งที่เหลือฉันเดา
Ravexina

@Ravexina: ทุกอย่างไม่สามารถต้องเปลือก pythonค่อนข้างแน่ใจว่าจะเรียกใช้กระบวนการที่คุณต้องการเพียงแค่เทอร์มินัลแอปพลิเคชันและเพื่อให้os.system("sudo ...")คุณใช้เพียงเคอร์เนล * nix บางทีฉันอาจจะลองใช้ VM ในภายหลัง ...
ซ้าย

นอกจากนี้เมื่อcdเข้าสู่สคริปต์มักจะดีcd -กว่าถ้าคุณกลับไปยังที่ที่คุณอยู่แทนที่จะสมมติว่าคุณมีไดเรกทอรีหนึ่งรายการ หากคุณเปลี่ยนค่าเริ่มต้นสิ่งcdนั้นcd ..จะไม่นำคุณกลับไปยังที่ที่คุณอยู่ แต่cd -จะ
Frambot

@ JoeFrambach เหมือนcd ..ฉันจะไม่ใช้cd -ในสคริปต์เท่านั้นที่บรรทัดคำสั่ง cd -อาจจะน้อยกว่าการรับประกันปัญหาcd ..แต่ฉันก็ยังไม่คิดว่าปลอดภัย - ถ้ามีคนเพิ่มการเปลี่ยนแปลงไดเรกทอรีเพิ่มเติมตรงกลางมันจะพาคุณไปที่ไหนสักแห่งโดยไม่ได้ตั้งใจ ในขณะที่ subshells ให้ขอบเขตที่ชัดเจนสำหรับการเปลี่ยนไดเร็กตอรี่และคุณกลับไปยังจุดไหน
leftaroundabout

@Ravexina ฉันเพิ่งลอง: Python สามารถเปิดตัวได้แน่นอน มันos.systemไม่ได้ทำงานโดยไม่มีshปัจจุบัน แต่ใช้subprocess.callงานได้
leftaroundabout
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.