Accidentalmente renombrado / bin ¡Ayuda!

39

Tengo una emergencia, un principiante de Linux y Bash aquí y me equivoqué al intentar escribir un script para cambiar el nombre de algunos archivos. El bucle subió accidentalmente por la ruta (ejecutó el script en una carpeta en el escritorio) y cambió /binde nombre a /D_bin( D_era el prefijo que agregué), por lo que ahora el sistema no puede usar /bincontenido, así que no bash, no mvpara cambiar el nombre, no sudo... Los archivos en /D_binestán bien, no cambia de nombre, y se puede copiar y pegar, pero no puede crear la carpeta /binde nuevo sin fiesta. El sistema se ve estable pero muy pocas cosas funcionan y no tienen acceso a los archivos en el escritorio.

Las otras carpetas de /like también /lib /sbin /etcparecen estar bien, y el escritorio gráfico todavía está allí. Tengo miedo de reiniciar porque no sé si podrá arrancar.

¿Hay una concha en la raíz o una manera de cambiar el nombre /D_binde nuevo a /bin? Necesito ayuda por favor, trabajo muy importante comprometido

Mi guión 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

:( ¡¡¡¡Gracias!!!!

Carlos D. Zapata
fuente
77
Podría intentar usar una máquina virtual para probar y aprender este tipo de cosas, por lo que nunca arriesgaría mucho.
M. Becerra
77
Ahora para solucionar el problema, puede hacer un USB de arranque con Ubuntu como si quisiera instalar el sistema operativo y presionar Probar Ubuntu , desde allí podría abrir un terminal y cambiar el nombre de la carpeta.
M. Becerra
32
/D_bin/mv -T /D_bin /biny no ejecutes tus scripts como root la próxima vez.
Jason C
55
Por cierto, cuando hago scripts como este, generalmente hago una ejecución en seco primero haciendo que el script haga eco de comandos potencialmente destructivos en lugar de ejecutarlos y verificar que sus acciones sean sensatas. También: copias de seguridad regulares.
Jason C

Respuestas:

89

Hay varias formas de solucionar este problema.

Si tiene acceso a un shell (cualquier terminal abierto), ejecute:

sudo /D_bin/mv -T /D_bin /bin

sudoestá en /usr/binmodo que no hay necesidad de ejecutarlo con una ruta absoluta.

La otra cosa que puede hacer es agregar la variable /D_bina su PATHentorno, como esta:

export PATH=$PATH:/D_bin

Si no tiene acceso a ningún shell:

  1. reiniciar el sistema
  2. cuando aparezca grub, presione epara editar el grub
  3. Al final de la línea que comienza con Linux, agregue:

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

Ahora se lo colocará en un shell bash, debe volver a montar el sistema de archivos como leído y grabable.

/D_bin/mount -o remount,rw /

Y mueva el directorio D_bin a bin:

/D_bin/mv -T /D_bin /bin

Luego reinicie el sistema.

Debería funcionar, pero si nada funcionó para usted, aún puede arrancar el sistema con un disco ubuntu / usb en vivo y solucionar el problema.

Ravexina
fuente
2
El primero lo resolvió. Muchas gracias, realmente me salvó el día. Por curiosidad, al ver el guión, ¿por qué llegó el cambio de nombre / bin? Todas las carpetas en Desktop obtuvieron la '_D' pero ninguna otra en casa o en la raíz, excepto bin.
Carlos D. Zapata
9
@ CarlosD.Zapata: si necesita cambiar el directorio en un bucle en un script, a menudo es una buena idea ejecutar el código en un sub-ella. Agregue un paréntesis abierto antes del cd "$j"(el nombre debe estar entre comillas dobles) y reemplace la travesura cd ..con el paréntesis cerrado correspondiente. Además, ¿por qué estabas corriendo como root? No deberías poder hacer tanto daño.
Jonathan Leffler
3
@ CarlosD.Zapata: después de cd ..poner un pwd, elimine su findcomando del script, luego ejecútelo como un usuario normal. verá que el script entra /, porque hace un cd $ j, que supongo que son archivos, no directorios. así que en cada ciclo das un paso atrás y finalmente estás dentro /.
Ravexina
1
@ CarlosD.Zapata Tenga en cuenta que podría haberse "detenido" /binporque estaba trabajando en carpetas en el interior /bin. Los verificaría (¡aunque no como root!)
wizzwizz4
17
Probablemente se detuvo en / bin porque / bin fue la primera carpeta en / que pasó a cambiar el nombre (es alfabéticamente primero), y después de eso, ya no pudo ejecutarse mv.
user253751
8

Para solucionar este problema si no tiene una terminal abierta, primero intentaré encontrar un "sustituto de shell" que pueda usar en lugar de bash. Python está dentro /usr/bin, por lo que aún debería funcionar.

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

Si eso no funciona, simplemente iniciaría directamente desde un CD / USB en vivo y arreglaría todo desde un entorno de ejecución conocido.

Como consejo general, apoyaría a Jonathan Leffler en los comentarios: nunca lo use cd ..en scripts, puede conducir fácilmente a tales problemas. Mejor solo cd en el $jdirectorio dentro de una subshell , de esta manera no tiene que preocuparse por volver.

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

Además, por supuesto, no ejecute cosas como root a menos que sea absolutamente necesario.

a la izquierda
fuente
¿Es posible ejecutar un shell interactivo como python sin tener acceso a ningún otro shell / terminal? Creo que la solución debería ser crear un script que contenga el comando junto con la contraseña para ejecutarlo como root. GUI hará el resto, supongo.
Ravexina
@Ravexina: no todo puede necesitar un caparazón . Bastante seguro de ejecutar el pythonproceso, solo necesita una aplicación de terminal, y para ejecutar os.system("sudo ...")solo necesita un kernel * nix. Tal vez lo probaré en una VM más tarde ...
Leftaroundabout
Además, cuando se cdutilizan scripts, generalmente es mejor cd -volver a donde estaba, en lugar de suponer que ha bajado un directorio. Si cambia la inicial cd, entonces cd ..no lo llevará de regreso a donde estaba, pero lo cd -hará.
Frambot
@JoeFrambach como cd ..yo no usar cd -en los scripts, solamente en la línea de comandos. cd -quizás no sea una garantía de problemas cd .., pero aún así no lo consideraría seguro : si alguien agrega más cambios en el directorio en el medio, lo llevará a algún lugar sin querer. Mientras que los subshells le dan un alcance claramente delimitado sobre dónde cambia el directorio y a qué punto regresa.
Leftaroundabout
@Ravexina Lo acabo de probar: Python puede ser lanzado. Su os.systemqué no funciona sin shpresentes, pero subprocess.calllas obras.
Leftaroundabout