不小心重命名了/ bin帮助!


39

我在这里遇到了紧急情况,Linux和Bash初学者,试图写一个脚本来重命名一些文件时搞砸了。循环意外地沿着路径移动(将脚本运行在Desktop的某个文件夹中)并重命名/bin/D_binD_是我添加的前缀),所以现在系统无法使用/bin内容,因此,no bash,no mv重命名,no sudo...这些文件在/D_bin都OK,没有改名,并可以将它们复制粘贴,但无法创建文件夹/bin没有bash的一次。该系统看起来很稳定,但是几乎没有任何工作,并且无法访问Desktop中的文件。

其他/类似的文件夹/lib /sbin /etc似乎也不错,并且图形桌面仍然存在。我害怕重启,因为我不知道它是否能够启动。

根目录中是否有shell或将其重命名/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. Becerra

7
现在要解决此问题,您可以使用Ubuntu创建可启动的USB,就像您要安装操作系统一样,然后按Try Ubuntu,从那里可以打开终端并重命名文件夹。
M. Becerra


32
/D_bin/mv -T /D_bin /bin并且下次不要以root用户身份运行脚本。
Jason C

5
顺便说一句,当制作这样的脚本时,我通常会先让脚本回显可能具有破坏性的命令,而不是运行它们并验证其动作是否正常,然后进行空运行。另外:定期备份。
Jason C

Answers:


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 shell中,应该将文件系统重新安装为可读写。

/D_bin/mount -o remount,rw /

并将D_bin目录移动到bin:

/D_bin/mv -T /D_bin /bin

然后重新启动系统。

它应该可以工作,但是如果没有任何效果,您仍然可以使用实时ubuntu磁盘/ usb引导系统并解决问题。


2
第一个解决了它。非常感谢,真的挽救了我的一天。出于好奇,通过观看脚本为什么重命名达到了/ bin?桌面中的所有文件夹都带有“ _D”,但在家中或根目录中没有其他文件夹(bin)。
卡洛斯D.扎帕塔

9
@ CarlosD.Zapata:如果您需要在脚本循环中更改目录,通常最好在子目录中运行代码。在cd "$j"(之前的名称应该用双引号引起来)之前添加一个开放的括号,并用cd ..匹配的封闭的括号代替捣蛋。另外,为什么要以root用户身份运行。您不应该造成那么多伤害。
乔纳森·勒夫勒

3
@ CarlosD.Zapata:你的后cd ..pwd,免除您find从脚本命令,然后运行它作为一个普通用户。您会看到脚本进入/,因为您执行了cd $ j,我想是文件而不是目录。所以在每个循环中你都会向后退一步,最后进入了/
Ravexina

1
@ CarlosD.Zapata请记住,它可能已“停止”运行,/bin因为它正在处理其中的文件夹/bin。我会检查那些(尽管不是root!)
wizzwizz4

17
它可能在/ bin上停止了,因为/ bin是/中的第一个文件夹,碰巧它被重命名了(按字母顺序排列是第一个),然后,它不再运行mv
user253751'4

8

要解决此问题(如果没有打开的运行终端),我将首先尝试找到一个可以代替bash使用的“ shell替代品”。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引导并修复已知运行环境中的所有错误。

作为一般建议,我在评论中仅次于Jonathan Leffler:切勿cd ..在脚本中使用它,否则很容易导致此类问题。最好只将cd放入子shell$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内核即可。也许稍后我会在VM中进行尝试...
左右约

另外,cd在使用脚本时,通常最好cd -返回到原来的位置,而不是假设您将CD目录下移。如果您更改初始字母cd,则不cd ..会使您回到原来的位置,但是cd -会。
Frambot

就像cd ..不会cd -在脚本中使用@JoeFrambach一样,只能在命令行中使用。cd -也许比麻烦的担保要少cd ..,但是我仍然认为它不安全 –如果有人在中间添加更多目录更改,它将带您到意外的地方。子外壳为您提供了一个明确界定范围的目录,用于更改目录的位置以及返回的位置。
leftaboutabout

@Ravexina我刚刚尝试过:Python确实可以启动。它os.system没有工作没有sh出现,但subprocess.call作品。
leftaboutabout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.