Renomeado acidentalmente / bin Ajuda!

39

Eu tenho uma emergência, iniciante em Linux e Bash aqui e errei tentando escrever um script para renomear alguns arquivos. O loop acidentalmente subiu o caminho (executou o script em uma pasta na área de trabalho) e renomeou /binpara /D_bin( D_foi o prefixo que eu adicionei), agora o sistema não pode usar o /binconteúdo, então não bash, não mvpara renomear, não sudo... Os arquivos em /D_binsão ok, não renomeado, e pode copiar e colá-los, mas não pode criar a pasta /binnovamente sem bash. O sistema parece estável, mas poucas coisas funcionam e não têm acesso aos arquivos no Desktop.

As outras pastas do /like também /lib /sbin /etcparecem bem, e a área de trabalho gráfica ainda está lá. Tenho medo de reiniciar porque não sei se será capaz de inicializar.

Existe um shell na raiz ou uma maneira de renomear /D_binnovamente /bin? Precisa de ajuda, por favor, trabalho muito importante comprometido

Meu script 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

:( Obrigado!!!!

Carlos D. Zapata
fonte
7
Você pode tentar usar uma VM para tentar aprender esse tipo de coisa, para nunca arriscar muito.
M. Becerra
7
Agora, para corrigir o problema, você pode fazer um USB inicializável com o Ubuntu como se quisesse instalar o sistema operacional e pressionar Experimente o Ubuntu ; a partir daí, você pode abrir um terminal e renomear a pasta.
M. Becerra
2
Possível duplicado de Revert diretório movimento raiz recursivamente
Muru
32
/D_bin/mv -T /D_bin /bine não execute seus scripts como root na próxima vez.
Jason C
5
Btw, ao criar scripts como esse, geralmente faço uma execução a seco primeiro, fazendo com que o script faça eco de comandos potencialmente destrutivos, em vez de executá-los e verificando se suas ações serão saudáveis. Também: backups regulares.
Jason C

Respostas:

89

Existem várias maneiras de corrigir esse problema.

Se você tiver acesso a um shell (qualquer terminal aberto), execute:

sudo /D_bin/mv -T /D_bin /bin

sudoestá em /usr/binmodo, não há necessidade de executá-lo com caminho absoluto.

A outra coisa que você pode fazer é, adicionando o /D_binà sua PATHvariável de ambiente, como este:

export PATH=$PATH:/D_bin

Se você não tem acesso a nenhum shell:

  1. reinicie o sistema
  2. quando o grub aparecer, pressione epara editar o grub
  3. no final da linha que começa com linux, adicione:

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

Agora você será direcionado para um shell bash; remonte o sistema de arquivos como lido e gravável.

/D_bin/mount -o remount,rw /

E mova o diretório D_bin para bin:

/D_bin/mv -T /D_bin /bin

Em seguida, reinicie o sistema.

Deve funcionar, mas se nada funcionou para você, você ainda pode inicializar o sistema com um disco / usb ativo do ubuntu e corrigir o problema.

Ravexina
fonte
2
O primeiro resolveu. Muito obrigado, realmente salvou o meu dia. Por curiosidade, assistindo o script por que a renomeação chegou a / bin? Todas as pastas na área de trabalho têm o '_D', mas nenhuma outra em casa ou na raiz, exceto a bin.
Carlos D. Zapata
9
@ CarlosD.Zapata: se você precisar alterar o diretório em um loop de um script, geralmente é uma boa ideia executar o código em uma sub-ela. Adicione um parêntese aberto antes de cd "$j"(o nome deve estar entre aspas duplas) e substitua a criação de travessuras pelo cd ..parêntese próximo correspondente. Além disso, por que você estava executando como root. Você não deve ser capaz de causar tanto dano.
27416 Jonathan-Jeferson-
3
@ CarlosD.Zapata: depois de cd ..colocar um pwd, remova seu findcomando do script e execute-o como um usuário normal. você verá o script entrar /, porque você faz um cd $ j que eu acho que são arquivos, não diretórios. então, em cada loop, você recua um passo e finalmente entra /.
Ravexina
11
@ CarlosD.Zapata Lembre-se de que ele pode ter "parado" /binporque estava trabalhando em pastas dentro /bin. Eu iria verificar aqueles (embora não como root!)
wizzwizz4
17
Provavelmente parou no / bin porque / bin foi a primeira pasta em / que foi renomeada (é primeiro alfabética) e, depois disso, não pôde mais ser executada mv.
precisa saber é o seguinte
8

Para corrigir esse problema se você não tiver um terminal em execução aberto, primeiro tentaria encontrar um “substituto de shell” que você possa usar em vez do bash. Python está dentro /usr/bin, então isso ainda deve 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"])

Se isso não funcionar, eu simplesmente inicializava diretamente do CD / USB ativo e corrigia tudo, desde um ambiente de execução conhecido.

Como um conselho geral, gostaria de destacar Jonathan Leffler nos comentários: nunca use cd ..em scripts, isso pode facilmente levar a esses problemas. Melhor apenas fazer o cd no $jdiretório dentro de um subshell , assim você não precisa se preocupar em voltar.

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

Além disso, é claro, não execute coisas como root, a menos que seja absolutamente necessário.

leftaroundabout
fonte
É possível executar um shell interativo como o python sem ter acesso a nenhum outro shell / terminal? Eu acho que a solução alternativa deve estar criando um script que contém o comando ao lado da senha para executá-lo como root. A GUI fará o resto, eu acho.
Ravexina
@Ravexina: nem tudo pode precisar de uma concha . Certamente, para executar o pythonprocesso, você só precisa de um aplicativo de terminal, e para executar, os.system("sudo ...")você só precisa de um kernel * nix. Talvez eu vou experimentá-lo em uma VM mais tarde ...
leftaroundabout
Além disso, ao cdinserir scripts, geralmente é melhor cd -voltar para onde você estava, em vez de assumir que você colocou um diretório em um CD. Se você alterar a inicial cd, cd ..ela não o levará de volta para onde estava, mas cd -sim.
Frambot 03/04
@ JoeFrambach como cd ..eu não usaria cd -em scripts, apenas na linha de comando. cd -é talvez menos garantia de problemas do que cd .., mas eu ainda não consideraria seguro - se alguém adicionar mais alterações de diretório no meio, isso o levará a algum lugar não intencional. Enquanto os subshells fornecem um escopo claramente delimitado para onde o diretório é alterado e para qual ponto você volta.
leftaroundabout
@Ravexina Eu apenas tentei: o Python pode realmente ser lançado. Sua os.systemse não trabalhar sem shpresentes, mas subprocess.callobras.
precisa saber é o seguinte