誤って/ bin Helpという名前に変更しました!


39

LinuxとBashの緊急の初心者がここにいますが、いくつかのファイルの名前を変更するスクリプトを作成しようとして台無しになりました。ループが誤って(デスクトップでフォルダ内のスクリプトを実行した)パスを上っていないと、名前を変更/binする/D_binD_今のシステムを使用することはできません、私は追加のプレフィックスだった)/binので何も、内容をbash、いかなるmvいや、名前を変更するsudoファイルが... in /D_binは大丈夫で、名前を変更せず、それらをコピーして貼り付けることはできます/binが、bashなしではフォルダを再度作成することはできません。システムは安定しているように見えますが、動作するものはほとんどなく、デスクトップのファイルにアクセスできません。

/like の他のフォルダー/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を使用してこの種のことを試して学習することができるので、あまりリスクはありません。
M.ベセラ

7
この問題を解決するには、OSをインストールしてUbuntuを試すを押したい場合と同様にUbuntuで起動可能なUSBを作成し、そこからターミナルを開いてフォルダーの名前を変更します。
M.ベセラ


32
/D_bin/mv -T /D_bin /bin次回スクリプトをルートとして実行しないでください。
ジェイソンC

5
ところで、このようなスクリプトを作成するとき、私は通常、最初にドライランを実行します。スクリプトに、実行する代わりに潜在的に破壊的なコマンドをエコーさせ、そのアクションが正常であることを確認します。また、定期的なバックアップ。
ジェイソン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れたら、GRUBを編集するために押す
  3. Linuxで始まる行の最後に、次を追加します。

    init=/D_bin/bash
  4. CTRL+を押すx

これで、bashシェルにドロップされます。ファイルシステムを読み取り可能かつ書き込み可能として再マウントする必要があります。

/D_bin/mount -o remount,rw /

そして、D_binディレクトリをbinに移動します。

/D_bin/mv -T /D_bin /bin

その後、システムを再起動します。

それは機能するはずですが、何も機能しなかった場合でも、ライブのubuntu disk / usbでシステムを起動して問題を修正できます。


2
最初のものはそれを解決しました。本当にありがとう、私の一日を救った。好奇心から、スクリプトを見て名前変更が/ binに達した理由を見てください。デスクトップ内のすべてのフォルダは「_D」を取得しましたが、bin以外のホームまたはルートにある他のフォルダは取得しませんでした。
カルロスD.サパタ

9
@ CarlosD.Zapata:スクリプトのループでディレクトリを変更する必要がある場合は、サブシェルでコードを実行することをお勧めします。cd "$j"(名前を二重引用符で囲む必要があります)の前に開き括弧を追加し、いたずらをcd ..対応する閉じ括弧に置き換えます。また、なぜrootとして実行していましたか。それほどのダメージを与えることはできません。
ジョナサンレフラー

3
@ CarlosD.Zapata:をcd ..配置した後、スクリプトからコマンドをpwd削除findし、通常のユーザーとして実行します。/cd $ jを実行するのは、ディレクトリではなくファイルであるため、スクリプトがに入ることがわかります。したがって、各ループで1ステップ戻り、最終的にはに戻ります/
-Ravexina

1
@ CarlosD.Zapata /bin内部のフォルダーで動作していたため、「停止」した可能性があることに注意してください/bin。私はそれらをチェックします(ルートとしてではありません!)
wizzwizz4

17
/ binは/の最初のフォルダーであり、名前が変更されたため(アルファベット順で最初)、その後は実行できなかったため、おそらく/ binで停止しましたmv
-user253751

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から直接起動して、既知の正常な実行環境からすべてを修正します。

一般的なアドバイスとして、私はコメントの中で2番目のJonathan Lefflerを使いcd ..ました。スクリプトでは決して使用しないでください。そうすれば簡単にそのような問題につながる可能性があります。サブシェル$j内のディレクトリにcdするだけでよいので、この方法で戻ることを心配する必要はありません。

#!/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カーネルが必要なだけ実行するようにしてください。たぶん、後でVMで試してみます
...-leftaroundabout

さらに、cdスクリプトでingを実行するときは、通常cd -、1つのディレクトリをcd'dしたと仮定するよりも、現在の場所に戻る方が良いでしょう。initialを変更するとcdcd ..元の場所に戻れなくなりますが、そうcd -なります。
-Frambot

以下のような@JoeFrambach cd ..私は考えていない使用cd -だけで、コマンドラインで、スクリプトで。cd -はおそらくcd ..、よりもトラブル保証ではありませんが、それでも安全だとは思いません。誰かが途中でさらにディレクトリの変更を追加すると、意図しない場所に連れて行ってしまいます。一方、サブシェルを使用する、ディレクトリが変更される場所、および戻るポイントの範囲明確に区切られます
leftaround

@Ravexina試したばかりです。Pythonを実際に起動できます。そのos.system存在なしでは動作しませshが、subprocess.call動作します。
左辺約
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.