不小心改名/bin 求助!

Car*_*ata 38 command-line scripts

我有一个紧急情况,Linux 和 Bash 初学者在这里尝试编写脚本来重命名一些文件时搞砸了。循环不小心走上了路径(在桌面的文件夹中运行脚本)并重命名/bin/D_binD_是我添加的前缀)所以现在系统无法使用/bin内容,所以不bash,不mv重命名,不sudo......文件in/D_bin没问题,没有重命名,可以复制粘贴它们,但不能在/bin没有 bash 的情况下再次创建文件夹。系统看起来很稳定,但很少有东西可以工作并且无法访问桌面中的文件。

其他的/like文件夹/lib /sbin /etc好像也没问题,图形桌面还在。我害怕重启,因为我不知道它是否能够启动。

root 中是否有 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
Run Code Online (Sandbox Code Playgroud)

:( 谢谢!!!!

Rav*_*ina 88

有多种方法可以解决此问题。

如果您有权访问 shell(任何打开的终端),请运行:

sudo /D_bin/mv -T /D_bin /bin
Run Code Online (Sandbox Code Playgroud)

sudo是在/usr/bin所以没有必要用绝对路径运行它。

您可以做的另一件事是,将 加入/D_bin到您的PATH环境变量中,如下所示:

export PATH=$PATH:/D_bin
Run Code Online (Sandbox Code Playgroud)

如果您无权访问任何 shell:

  1. 重新启动系统
  2. 当 grub 出现时按下e编辑 grub
  3. 在以 linux 开头的行的末尾,添加:

    init=/D_bin/bash
    
    Run Code Online (Sandbox Code Playgroud)
  4. CTRL+x

现在您将被放入 bash shell,您应该将文件系统重新挂载为可读写。

/D_bin/mount -o remount,rw /
Run Code Online (Sandbox Code Playgroud)

并将 D_bin 目录移动到 bin:

/D_bin/mv -T /D_bin /bin
Run Code Online (Sandbox Code Playgroud)

然后重启系统。

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

  • 它可能停在 /bin 上,因为 /bin 是 /bin 中第一个碰巧重命名的文件夹(按字母顺序排在第一位),之后就无法再运行 `mv`。 (17认同)
  • @CarlosD.Zapata:如果您需要在脚本的循环中更改目录,那么在子文件中运行代码通常是个好主意。在 `cd "$j"` 之前添加一个左括号(名称应该用双引号引起来),并将恶作剧的 `cd ..` 替换为匹配的右括号。另外,你为什么以root身份运行。你不应该造成那么大的伤害。 (9认同)
  • @CarlosD.Zapata:在你的 `cd ..` 放置一个 `pwd` 之后,从脚本中删除你的 `find` 命令,然后以普通用户身份运行它。你会看到脚本进入`/`,因为你做了一个 cd $j 我猜它是文件而不是目录。所以在每个循环中你都往后退一步,最后你在`/`。 (3认同)
  • 第一个解决了。非常感谢,真的拯救了我的一天。出于好奇,通过观看脚本为什么重命名到达 /bin?Desktop 中的所有文件夹都带有“_D”,但除了 bin 之外,家里或根目录下的其他文件夹都没有。 (2认同)

lef*_*out 8

如果您没有打开正在运行的终端,要解决这个问题,我会首先尝试找到一个“shell 替代品”,您可以使用它来代替 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"])
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,我将直接从 Live CD/USB 启动,然后从已知正常的运行环境中修复所有内容。

作为一般建议,我会在评论中第二个 Jonathan Leffler:永远不要cd ..在脚本中使用,它很容易导致此类问题。最好只 cd 进入subshel​​l 中$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
Run Code Online (Sandbox Code Playgroud)

另外,当然,除非绝对必要,否则不要以 root 身份运行东西。