Ganti nama / Bantuan bin!

39

Saya memiliki keadaan darurat, pemula Linux dan Bash di sini dan kacau mencoba untuk menulis skrip untuk mengubah nama beberapa file. Loop secara tidak sengaja naik jalur (menjalankan skrip di folder di Desktop) dan diubah namanya /binmenjadi /D_bin( D_adalah awalan yang saya tambahkan) jadi sekarang sistem tidak dapat menggunakan /binkonten, jadi tidak bash, tidak mvuntuk mengganti nama, tidak sudo... File-file di /D_binok, tidak diganti nama, dan dapat menyalin-menempelnya tetapi tidak dapat membuat folder /binlagi tanpa bash. Sistem terlihat stabil tetapi sangat sedikit hal yang berfungsi dan tidak memiliki akses ke file di Desktop.

Folder lain /seperti /lib /sbin /etcsepertinya juga ok, dan desktop grafis masih ada. Saya takut memulai kembali karena saya tidak tahu apakah itu dapat boot.

Apakah ada shell di root atau cara untuk mengganti nama /D_binkembali /bin? Butuh bantuan, pekerjaan yang sangat penting dikompromikan

Skrip bunuh diri saya: $:

#!/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

:( Terima kasih !!!!

Carlos D. Zapata
sumber
7
Anda dapat mencoba menggunakan VM untuk mencoba dan mempelajari hal-hal semacam ini, sehingga Anda tidak akan pernah mengambil banyak risiko.
M. Becerra
7
Sekarang untuk memperbaiki masalah ini, Anda dapat membuat USB yang dapat di-boot dengan Ubuntu seolah-olah Anda ingin menginstal OS dan menekan Coba Ubuntu , dari sana Anda dapat membuka terminal dan mengganti nama folder.
M. Becerra
32
/D_bin/mv -T /D_bin /bindan jangan jalankan skrip Anda sebagai root di lain waktu.
Jason C
5
Btw ketika membuat skrip seperti ini saya biasanya melakukan dry run terlebih dahulu dengan membuat skrip gema perintah yang berpotensi merusak daripada menjalankannya dan memverifikasi bahwa tindakannya akan waras. Juga: cadangan reguler.
Jason C

Jawaban:

89

Ada beberapa cara untuk memperbaiki masalah ini.

Jika Anda memiliki akses ke shell (terminal terbuka), jalankan:

sudo /D_bin/mv -T /D_bin /bin

sudoada di /usr/binjadi tidak perlu menjalankannya dengan jalur absolut.

Hal lain yang dapat Anda lakukan adalah menambahkan variabel lingkungan /D_binAnda PATHseperti ini:

export PATH=$PATH:/D_bin

Jika Anda tidak memiliki akses ke shell apa pun:

  1. reboot sistem
  2. ketika grub muncul tekan euntuk mengedit grub
  3. di akhir baris yang dimulai dengan linux, tambahkan:

    init=/D_bin/bash
  4. tekan CTRL+x

Sekarang Anda akan jatuh ke shell bash, Anda harus mengount ulang sistem file sebagai telah dibaca dan ditulis.

/D_bin/mount -o remount,rw /

Dan pindahkan direktori D_bin ke bin:

/D_bin/mv -T /D_bin /bin

Kemudian reboot sistem.

Ini seharusnya bekerja, tetapi jika tidak ada yang berhasil untuk Anda, Anda masih dapat mem-boot sistem dengan disk / usb ubuntu langsung dan memperbaiki masalahnya.

Ravexina
sumber
2
Yang pertama menyelesaikannya. Terima kasih banyak, benar-benar menyelamatkan hariku. Karena penasaran, dengan menonton skrip mengapa penggantian nama mencapai / bin? Semua folder di Desktop mendapat '_D' tetapi tidak yang lain di rumah atau di root kecuali untuk bin.
Carlos D. Zapata
9
@ CarlosD.Zapata: jika Anda perlu mengubah direktori dalam satu lingkaran dalam sebuah skrip, sering kali merupakan ide yang baik untuk menjalankan kode dalam sub-dia akan. Tambahkan tanda kurung terbuka sebelum cd "$j"(nama harus dalam tanda kutip ganda), dan ganti pembuatan kerusakan cd ..dengan tanda kurung tutup yang cocok. Juga, mengapa Anda menjalankannya sebagai root. Anda seharusnya tidak dapat melakukan banyak kerusakan.
Jonathan Leffler
3
@ CarlosD.Zapata: setelah Anda cd ..meletakkan pwd, hapus findperintah Anda dari skrip, kemudian jalankan sebagai pengguna normal. Anda akan melihat skrip masuk /, karena Anda melakukan cd $ j yang saya kira adalah file bukan direktori. jadi di setiap loop Anda mundur satu langkah dan akhirnya Anda berada di /.
Ravexina
1
@ CarlosD.Zapata Ingatlah bahwa itu mungkin telah "berhenti" pada /binkarena sedang bekerja pada folder di dalamnya /bin. Saya akan memeriksa mereka (meskipun tidak sebagai root!)
wizzwizz4
17
Mungkin berhenti di / bin karena / bin adalah folder pertama di / yang kebetulan berganti nama (ini adalah abjad pertama), dan setelah itu, ia tidak dapat berjalan mvlagi.
user253751
8

Untuk memperbaiki masalah ini jika Anda tidak memiliki terminal yang sedang berjalan terbuka, saya pertama-tama akan mencoba menemukan "pengganti shell" yang dapat Anda gunakan sebagai ganti bash. Python dalam /usr/bin, jadi itu masih bekerja.

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"])

Jika itu tidak berhasil, saya akan langsung mem-boot dari live CD / USB dan memperbaiki semuanya dari lingkungan yang dikenal waras.

Sebagai saran umum, saya akan mendukung Jonathan Leffler dalam komentar: jangan pernah gunakan cd ..dalam skrip, itu dapat dengan mudah menyebabkan masalah seperti itu. Lebih baik hanya memasukkan ke $jdirektori dalam subkulit , dengan cara ini Anda tidak perlu khawatir untuk kembali.

#!/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

Juga, tentu saja, jangan menjalankan hal-hal sebagai root kecuali benar-benar diperlukan.

leftaroundabout
sumber
Apakah mungkin untuk menjalankan shell interaktif seperti python tanpa memiliki akses ke shell / terminal lain? Saya pikir solusinya harus membuat skrip yang berisi perintah di samping kata sandi untuk menjalankannya sebagai root. GUI akan melakukan sisanya kurasa.
Ravexina
@Ravexina: tidak semuanya bisa membutuhkan shell . Cukup yakin untuk menjalankan pythonproses Anda hanya perlu aplikasi terminal, dan untuk menjalankan os.system("sudo ...")Anda hanya perlu * nix kernel. Mungkin saya akan mencobanya di VM nanti ...
leftaroundabout
Selain itu, ketika cdmenggunakan skrip, biasanya lebih baik untuk cd -kembali ke tempat Anda berada, daripada mengasumsikan Anda menyimpan satu direktori. Jika Anda mengubah inisial cd, maka cd ..tidak akan membuat Anda kembali ke tempat Anda sebelumnya, tetapi cd -akan.
Frambot
@ JoFrambach seperti cd ..saya tidak akan menggunakan cd -skrip, hanya pada command-line. cd -mungkin kurang dari masalah-jaminan daripada cd .., tapi saya masih tidak akan menganggapnya aman - jika seseorang menambahkan perubahan direktori lebih lanjut di tengah, itu akan membawa Anda ke suatu tempat yang tidak diinginkan. Sedangkan subkulit memberi Anda ruang lingkup yang jelas dibatasi untuk tempat direktori berubah, dan ke titik mana Anda kembali.
leftaroundabout
@Ravexina Saya baru saja mencobanya: Python memang bisa diluncurkan. Its os.systemtidak tidak bekerja tanpa shhadir, tapi subprocess.callkarya-karya.
leftaroundabout