Випадково перейменований / Бін Довідка!


39

У мене тут надзвичайна ситуація, Linux та Bash-початківець, і я заплутався, намагаючись написати сценарій для перейменування деяких файлів. Цикл випадково пішов вгору по шляху (запустив скрипт у папку на робочому столі) і перейменований /binна /D_bin( D_був доданий префікс, який я додав), тому тепер система не може використовувати /binвміст, так що ні bash, ні mvдля перейменування, ні sudo... Файли в /D_binпорядку, не перейменовані, і можна скопіювати їх, вставити, але не зможе /binзнову створити папку без bash. Система виглядає стабільною, але дуже мало речей працює і не має доступу до файлів на робочому столі.

Інші папки , /як /lib /sbin /etcздається, занадто добре, і графічний робочий стіл ще є. Я боюся перезапустити, тому що не знаю, чи вдасться її завантажувати.

Чи є оболонка в корені або спосіб перейменувати /D_binназад /bin? Потрібна допомога, будь ласка, дуже важлива робота порушена

Мій сценарій самогубства: $:

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

:( Спасибі!!!!


7
Ви можете спробувати використати VM, щоб спробувати навчитися подібним речам, тому ви ніколи не ризикуєте багато.
М. Бесерра

7
Тепер, щоб вирішити проблему, ви можете зробити завантажувальний USB з Ubuntu так, як якщо б ви хотіли встановити ОС і натиснути спробувати Ubuntu , звідти ви могли б відкрити термінал і перейменувати папку.
М. Бесерра


32
/D_bin/mv -T /D_bin /binі не запускайте сценарії як корінь наступного разу.
Джейсон C

5
Btw при створенні подібних сценаріїв я, як правило, спочатку виконую сухий запуск, маючи сценарій відлуння потенційно деструктивних команд замість того, щоб запускати їх і перевіряти, що його дії будуть здоровими. Також: регулярні резервні копії.
Джейсон C

Відповіді:


89

Існує кілька способів виправити це питання.

Якщо у вас є доступ до оболонки (будь-якого відкритого терміналу), запустіть:

sudo /D_bin/mv -T /D_bin /bin

sudoє в /usr/binтому, що немає необхідності запускати його з абсолютним шляхом.

Інше, що ви можете зробити, - це додати змінну /D_binдо PATHсередовища, наприклад:

export PATH=$PATH:/D_bin

Якщо у вас немає доступу до жодної оболонки:

  1. перезавантажте систему
  2. коли з'являється grub, натисніть, eщоб змінити його
  3. в кінці рядка, який починається з Linux, додайте:

    init=/D_bin/bash
  4. натисніть CTRL+x

Тепер ви будете переведені в оболонку bash, вам слід перезавантажити файлову систему як прочитану та записану.

/D_bin/mount -o remount,rw /

І перемістіть каталог D_bin у бін:

/D_bin/mv -T /D_bin /bin

Потім перезавантажте систему.

Це повинно працювати, але якщо для вас нічого не вийшло, ви все одно можете завантажувати систему за допомогою живого диска ubuntu / usb та виправляти проблему.


2
Перший вирішив це. Велике спасибі, дійсно врятував мені день. З цікавості, переглядаючи сценарій, чому перейменування досягло / бен? Усі папки на робочому столі отримали "_D", але не будь-які інші вдома або в корені, за винятком бін.
Карлос Д. Сапата

9
@ CarlosD.Zapata: якщо вам потрібно змінити каталог у циклі в сценарії, часто корисно запустити код у підпункті вона. Додайте відкриті дужки перед cd "$j"(ім'я має бути у подвійних лапках) та замініть помилки cd ..на відповідні дужки. Крім того, чому ви працювали як root. Ви не повинні бути в змозі зробити стільки шкоди.
Джонатан Леффлер

3
@ CarlosD.Zapata: після того, як ви cd ..поставили a pwd, видаліть свою findкоманду зі сценарію, а потім запустіть її як звичайний користувач. ви побачите, що сценарій входить /, тому що ви робите cd $ j, який, мабуть, є файлами, а не каталогами. тож у кожному циклі ти йдеш на крок назад і, нарешті, перебуваєш /.
Равексіна

1
@ CarlosD.Zapata Майте на увазі, що воно могло "зупинитися", /binоскільки воно працювало над папками всередині /bin. Я перевірив би їх (хоча і не як root!)
wizzwizz4

17
Він, ймовірно, зупинився на / bin, тому що / bin була першою папкою в /, що трапилось перейменувати (спочатку це в алфавітному порядку), і після цього він більше не міг працювати mv.
користувач253751

8

Щоб вирішити цю проблему, якщо у вас немає відкритого терміналу, я спершу спробую знайти «замінник оболонки», який ви можете використовувати замість bash. Python є /usr/bin, так що він повинен працювати.

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

Якщо це не працює, я б просто завантажувався з живого CD / USB і виправляв усе з відомих нормальних умов роботи.

Як загальну пораду, я б другий Джонатан Леффлер в коментарях: ніколи не використовуйте cd ..в сценаріях, це може легко призвести до таких проблем. Краще лише введіть компакт-диск у $jкаталог у межах передплати , таким чином вам не доведеться турбуватися про повернення назад.

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

Також, звичайно, не запускайте матеріали як root, якщо це абсолютно не потрібно.


Чи можливо запустити інтерактивну оболонку типу python, не маючи доступу до будь-якої іншої оболонки / терміналу? Я думаю, що для вирішення проблеми має бути створення сценарію, який містить команду поряд із паролем, щоб запустити його як root. GUI зробить все, що я здогадуюсь.
Ravexina

@Ravexina: не все може потребувати оболонки . Досить впевнений, що для запуску pythonпроцесу вам просто потрібна термінальна програма, а для запуску os.system("sudo ...")вам потрібно лише ядро ​​* nix. Можливо, я спробую це у
вітчизняному відомстві

Крім того, під час використання cdсценаріїв, як правило, краще cd -повернутися туди, де ви були, а не припускати, що ви cd'd один каталог вниз. Якщо змінити початковий cd, то cd ..не повернешся туди, де ти був, але cd -буде.
Фрамбот

@JoeFrambach, як cd ..я б не використовував cd -у скриптах, лише в командному рядку. cd -це, мабуть, менше гарантії, ніж ніж cd .., але я все одно не вважаю це безпечним - якщо хтось додасть подальші зміни в каталозі в середині, це доставить вас кудись непередбачувано. Тоді як передплани надають вам чітко розмежувану область, де змінюється каталог, і до якого моменту ви повернетесь назад.
близько

@Ravexina Я просто спробував: Python дійсно може бути запущений. Його os.systemзовсім НЕ працювати без shсправжнього, але subprocess.callпрацює.
Ліворуч близько
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.