Accidentellement renommé / bin Aide!

39

J'ai une urgence, Linux et Bash débutant ici et foiré en essayant d'écrire un script pour renommer des fichiers. La boucle a accidentellement le chemin (couru le script dans un dossier de bureau) et renommé /binà /D_bin( D_était le préfixe j'ajouté) maintenant le système ne peut pas utiliser le /bincontenu, donc pas bash, pas mvde renommer, pas sudo... Les fichiers in /D_binsont ok, pas renommés, et peuvent les copier-coller mais ne peuvent pas recréer de dossier /binsans bash. Le système semble stable, mais très peu de choses fonctionnent et n’ont pas accès aux fichiers de Desktop.

Les autres dossiers /similaires /lib /sbin /etcsemblent bien aussi, et le bureau graphique est toujours là. J'ai peur de redémarrer parce que je ne sais pas s'il pourra démarrer.

Y at - il une coquille dans la racine ou une façon de renommer /D_binrevenir à /bin? Besoin d'aide s'il vous plaît, travail très important compromis

Mon script suicidaire: $:

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

:( Merci!!!!

Carlos D. Zapata
la source
7
Vous pouvez essayer d’utiliser une machine virtuelle pour apprendre ce genre de choses, afin de ne jamais risquer beaucoup.
M. Becerra le
7
Maintenant, pour résoudre le problème, vous pouvez créer une clé USB amorçable avec Ubuntu comme si vous vouliez installer le système d’exploitation et appuyer sur Try Ubuntu . À partir de là, vous pourrez ouvrir un terminal et renommer le dossier.
M. Becerra le
32
/D_bin/mv -T /D_bin /binet ne lancez pas vos scripts en tant que root la prochaine fois.
Jason C
5
Btw lors de la création de scripts comme celui-ci, je fais généralement un essai à blanc en faisant en sorte que le script fasse écho à des commandes potentiellement destructives au lieu de les exécuter et en vérifiant que ses actions seront saines. Aussi: sauvegardes régulières.
Jason C

Réponses:

89

Il existe plusieurs façons de résoudre ce problème.

Si vous avez accès à un shell (n'importe quel terminal ouvert), lancez:

sudo /D_bin/mv -T /D_bin /bin

sudo est dans /usr/bin il n'y a donc pas besoin de l'exécuter avec un chemin absolu.

Vous pouvez également ajouter la /D_binà PATHla variable d’environnement, comme ceci:

export PATH=$PATH:/D_bin

Si vous n'avez accès à aucun shell:

  1. redémarrer le système
  2. lorsque grub apparaît, appuyez sur epour modifier le grub
  3. à la fin de la ligne qui commence par linux, ajoutez:

    init=/D_bin/bash
  4. appuyez sur CTRL+x

Maintenant que vous allez être déposé dans un shell bash, vous devez remonter le système de fichiers en lecture et en écriture.

/D_bin/mount -o remount,rw /

Et déplacez le répertoire D_bin vers bin:

/D_bin/mv -T /D_bin /bin

Puis redémarrez le système.

Cela devrait fonctionner, mais si rien ne fonctionnait pour vous, vous pouvez toujours démarrer le système avec un disque / usb ubuntu en direct et résoudre le problème.

Ravexina
la source
2
Le premier l'a résolu. Merci beaucoup, vraiment sauvé ma journée. Par curiosité, en regardant le script, pourquoi renommer atteint / bin? Tous les dossiers de Desktop ont reçu le '_D', mais aucun autre à la maison ou à la racine, à l'exception de bin.
Carlos D. Zapata
9
@ CarlosD.Zapata: si vous devez changer de répertoire en boucle dans un script, il est souvent judicieux d'exécuter le code dans un sous-répertoire. Ajoutez une parenthèse ouverte avant le cd "$j"(le nom doit être entre guillemets), et remplacez l'incident faisant mal cd ..avec la parenthèse proche correspondante. Aussi, pourquoi étiez-vous en tant que root. Vous ne devriez pas pouvoir faire autant de dégâts.
Jonathan Leffler
3
@ CarlosD.Zapata: après votre cd ..mettre un pwd, retirez votre findcommande à partir du script, puis exécutez en tant qu'utilisateur normal. vous verrez que le script entre /, parce que vous faites un cd $ j qui, je suppose, sont des fichiers et non des répertoires. donc, dans chaque boucle, vous faites un pas en arrière et vous êtes enfin dans /.
Ravexina
1
@ CarlosD.Zapata N'oubliez pas qu'il s'est peut-être "arrêté" /bincar il fonctionnait dans des dossiers /bin. Je vérifierais ceux-ci (mais pas en tant que root!)
wizzwizz4
17
Il s'est probablement arrêté sur / bin car / bin était le premier dossier de / qu'il était en train de renommer (c'est par ordre alphabétique en premier), et après cela, il ne pouvait plus être exécuté mv.
user253751
8

Pour résoudre ce problème si vous n'avez pas de terminal ouvert, essayez tout d'abord de trouver un "substitut de shell" que vous pouvez utiliser à la place de bash. Python est dans /usr/bin, donc cela devrait encore fonctionner.

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 cela ne fonctionne pas, je démarrerais directement à partir d'un CD / USB et réparer tout depuis un environnement de travail connu.

En règle générale, je seconderais Jonathan Leffler dans les commentaires: ne jamais utiliser cd ..de scripts, cela peut facilement conduire à de tels problèmes. Mieux vaut ne placer que le cd dans le $jrépertoire d’un sous - shell , de cette façon, vous n’aurez plus à vous inquiéter.

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

De plus, bien sûr, ne lancez rien en tant que root, sauf en cas d'absolue nécessité.

à gauche autour de
la source
Est-il possible d'exécuter un shell interactif tel que python sans avoir accès à aucun autre shell / terminal? Je pense que la solution de contournement devrait être de créer un script qui contienne la commande à côté du mot de passe pour l'exécuter en tant que root. GUI fera le reste je suppose.
Ravexina
@Ravexina: tout n’a pas besoin d’un shell . Bien sûr, pour exécuter le pythonprocessus, vous avez juste besoin d’une application de terminal, et pour le faire, os.system("sudo ...")vous avez besoin d’un noyau * nix. Peut-être que je l'essayerai plus tard dans une machine virtuelle ...
gauche au
De plus, lorsque vous insérez des cdscripts, il est généralement préférable de cd -revenir là où vous vous trouviez, plutôt que de supposer que vous avez cdé un répertoire. Si vous modifiez l'initiale cd, le cd ..ne vous ramènera pas à votre position actuelle, mais le cd -restera.
Frambot
@ JoeFrambach comme si cd ..je ne l' utilisais pascd - dans les scripts, uniquement en ligne de commande. cd -est peut-être moins une garantie de problèmes que cd .., mais je ne le considérerais toujours pas comme sûr . Si quelqu'un ajoute d'autres modifications de répertoire au milieu, cela vous mènera quelque part sans le vouloir. Tandis que les sous-coquilles vous donnent une portée clairement délimitée pour indiquer où le répertoire change et à quel point vous revenez en arrière.
gauche du
@Ravexina Je viens de l'essayer: Python peut en effet être lancé. Son os.systemne fonctionne pas sans shprésent, mais subprocess.callfonctionne.
gauche du