Rinominato accidentalmente / bin Aiuto!


39

Ho un'emergenza, un principiante Linux e Bash qui e ho incasinato il tentativo di scrivere uno script per rinominare alcuni file. Il ciclo accidentalmente salì sul percorso (correva lo script in una cartella in Desktop) e rinominato /binper /D_bin( D_era il prefisso ho aggiunto), così ora il sistema non può utilizzare /binil contenuto, in modo che nessun bash, nessun mvrinominare, non sudo... I file in /D_binsono ok, non rinominati e possono copiarli e incollarli ma non è possibile creare /binnuovamente la cartella senza bash. Il sistema sembra stabile ma funzionano pochissime cose e non hanno accesso ai file sul desktop.

Anche le altre cartelle di /like /lib /sbin /etcsembrano essere a posto e il desktop grafico è ancora lì. Ho paura di riavviare perché non so se sarà in grado di avviarsi.

C'è una shell di root o un modo per rinominare /D_bintornare a /bin? Hai bisogno di aiuto per favore, lavoro molto importante compromesso

La mia sceneggiatura suicida: $:

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

:( Grazie!!!!


7
Potresti provare a usare una VM per provare ad imparare questo tipo di cose, quindi non rischieresti mai molto.
M. Becerra,

7
Ora per risolvere il problema, potresti creare un USB avviabile con Ubuntu come se volessi installare il sistema operativo e premere Prova Ubuntu , da lì puoi aprire un terminale e rinominare la cartella.
M. Becerra,


32
/D_bin/mv -T /D_bin /bine non eseguire i tuoi script come root la prossima volta.
Jason C

5
A proposito, quando faccio script come questo, di solito eseguo prima una corsa a secco avendo lo script che fa eco a comandi potenzialmente distruttivi invece di eseguirli e verificando che le sue azioni saranno sane. Inoltre: backup regolari.
Jason C

Risposte:


89

Esistono diversi modi per risolvere questo problema.

Se hai accesso a una shell (qualsiasi terminale aperto), esegui:

sudo /D_bin/mv -T /D_bin /bin

sudoè /usr/binquindi non è necessario eseguirlo con percorso assoluto.

L'altra cosa che puoi fare è, aggiungendo /D_binl'alla PATHvariabile d'ambiente, in questo modo:

export PATH=$PATH:/D_bin

Se non hai accesso a nessuna shell:

  1. riavviare il sistema
  2. quando appare grub premere eper modificare grub
  3. alla fine della riga che inizia con Linux, aggiungi:

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

Ora verrai rilasciato in una shell bash, dovresti rimontare il file system come letto e scrivibile.

/D_bin/mount -o remount,rw /

E sposta la directory D_bin nel cestino:

/D_bin/mv -T /D_bin /bin

Quindi riavviare il sistema.

Dovrebbe funzionare, ma se nulla ha funzionato per te, puoi comunque avviare il sistema con un disco / usb Ubuntu live e risolvere il problema.


2
Il primo l'ha risolto. Grazie mille, mi ha davvero salvato la giornata. Per curiosità, guardando lo script perché la ridenominazione ha raggiunto / bin? Tutte le cartelle in Desktop hanno ottenuto il '_D' ma non nessun altro a casa o alla radice tranne che per bin.
Carlos D. Zapata,

9
@ CarlosD.Zapata: se devi cambiare directory in un ciclo in uno script, è spesso una buona idea eseguire il codice in un sub-lei. Aggiungi una parentesi aperta prima del cd "$j"(il nome deve essere tra virgolette doppie) e sostituisci la fabbricazione di birichini cd ..con la parentesi chiusa corrispondente. Inoltre, perché stavi correndo come root. Non dovresti essere in grado di fare così tanto danno.
Jonathan Leffler,

3
@ CarlosD.Zapata: dopo aver cd ..inserito un pwd, rimuovere il findcomando dallo script, quindi eseguirlo come un normale utente. vedrai lo script entrare /, perché fai un cd $ j che immagino siano file non directory. quindi in ogni ciclo fai un passo indietro e finalmente sei dentro /.
Ravexina,

1
@ CarlosD.Zapata Tieni presente che potrebbe essersi "fermato" /binperché stava lavorando su cartelle all'interno /bin.
Verificherei

17
Probabilmente si è fermato su / bin perché / bin è stata la prima cartella in / che è stata ribattezzata (è la prima in ordine alfabetico) e, successivamente, non è mvpiù stata eseguita .
user253751

8

Per risolvere questo problema se non hai un terminale in esecuzione aperto, proverei prima a trovare un "sostituto della shell" che puoi usare al posto di bash. Python è dentro /usr/bin, quindi dovrebbe funzionare ancora.

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

Se ciò non funziona, eseguo semplicemente l'avvio da CD / USB dal vivo e riparerei tutto da un ambiente in esecuzione ben noto.

Come consiglio generale, secondo i commenti di Jonathan Leffler: non usarlo mai cd ..negli script, può facilmente portare a tali problemi. Meglio solo cd nella $jdirectory all'interno di una subshell , in questo modo non devi preoccuparti di tornare indietro.

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

Inoltre, ovviamente, non eseguire roba come root a meno che non sia assolutamente necessario.


È possibile eseguire una shell interattiva come Python senza avere accesso ad altre shell / terminali? Penso che la soluzione alternativa dovrebbe essere la creazione di uno script che contenga il comando accanto alla password per eseguirlo come root. La GUI farà il resto immagino.
Ravexina,

@Ravexina: non tutto può aver bisogno di una shell . Abbastanza sicuro per eseguire il pythonprocesso hai solo bisogno di un'applicazione terminale e per eseguire os.system("sudo ...")hai solo bisogno di un kernel * nix. Forse lo proverò in una VM più tardi ...
leftaroundabout

Inoltre, quando si cdinseriscono gli script, di solito è meglio cd -tornare al punto in cui ci si trovava, piuttosto che supporre di aver scaricato una directory. Se cambi l'iniziale cd, allora cd ..non ti riporterà dove eri, ma lo cd -farà.
Frambot,

@JoeFrambach come cd ..vorrei , non usare cd -negli script, solo alla riga di comando. cd -è forse meno una garanzia di problemi di cd .., ma ancora non lo considero sicuro - se qualcuno aggiunge ulteriori modifiche alla directory nel mezzo, ti porterà da qualche parte involontariamente. Considerando che i subshells ti danno un ambito chiaramente delimitato per dove cambia la directory e per quale punto torni indietro.
leftaroundabout

@Ravexina L'ho appena provato: Python può davvero essere lanciato. La sua os.systemfa non funziona senza shpresente, ma subprocess.callopere.
leftaroundabout
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.