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


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.


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é.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.