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


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.


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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.