실수로 이름이 / bin Help로 바뀌 었습니다!


39

나는 비상 사태, Linux 및 Bash 초보자가 있으며 일부 파일의 이름을 바꾸는 스크립트를 작성하려고 엉망이되었습니다. 루프가 실수로 경로를 올라가고 (데스크톱의 폴더에서 스크립트를 실행했습니다) 이름 /bin을 변경 했습니다 /D_bin( D_추가 한 접두어였습니다). 이제 시스템은 /bin내용을 사용할 수 없으므로 no bash, no, no name mv, no sudo... 파일 in /D_bin은 이름이 바뀌지 않았으며 복사하여 붙여 넣을 수는 있지만 /binbash없이 폴더를 다시 만들 수는 없습니다 . 시스템은 안정적으로 보이지만 거의 작동하지 않으며 Desktop의 파일에 액세스 할 수 없습니다.

같은 다른 폴더도 /괜찮은 /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. Becerra

7
이제 문제를 해결하기 위해 OS를 설치하고 Ubuntu 시도를 누르는 것처럼 Ubuntu로 부팅 가능한 USB를 만들 수 있습니다. 거기서 터미널을 열고 폴더의 이름을 바꿀 수 있습니다.
M. Becerra


32
/D_bin/mv -T /D_bin /bin다음에 스크립트를 루트로 실행하지 마십시오.
Jason C

5
Btw는 이와 같은 스크립트를 만들 때 일반적으로 스크립트를 실행하는 대신 잠재적으로 파괴적인 명령을 에코하고 해당 동작이 정상인지 확인함으로써 드라이 런을 먼저 수행합니다. 또한 정기적 인 백업.
Jason C

답변:


89

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

쉘 (열린 터미널)에 액세스 할 수 있으면 다음을 실행하십시오.

sudo /D_bin/mv -T /D_bin /bin

sudo/usr/bin있으므로 절대 경로로 실행할 필요가 없습니다.

당신이 할 수있는 다른 일은 다음 과 같이 환경 변수에 /D_bin를 추가하는 것 PATH입니다.

export PATH=$PATH:/D_bin

쉘에 액세스 할 수없는 경우 :

  1. 시스템을 재부팅
  2. 그럽이 나타나면를 눌러 그럽 e을 편집합니다
  3. 리눅스로 시작하는 줄 끝에 다음을 추가하십시오.

    init=/D_bin/bash
  4. CTRL+를 누르십시오x

이제 bash 쉘에 들어가서 파일 시스템을 읽기 및 쓰기 가능으로 다시 마운트해야합니다.

/D_bin/mount -o remount,rw /

그리고 D_bin 디렉토리를 bin으로 옮기십시오 :

/D_bin/mv -T /D_bin /bin

그런 다음 시스템을 재부팅하십시오.

작동하지만 아무것도 효과가 없다면 여전히 라이브 우분투 디스크 / USB로 시스템을 부팅하고 문제를 해결할 수 있습니다.


2
첫 번째는 그것을 해결했습니다. 고마워, 정말 내 하루를 구했다. 이름 변경이 / bin에 도달 한 이유를 스크립트를보고 궁금한 점이 있습니까? Desktop의 모든 폴더에는 '_D'가 있지만 bin을 제외하고 집이나 루트에있는 다른 폴더는 없습니다.
Carlos D. Zapata

9
@ CarlosD.Zapata : 스크립트에서 루프의 디렉토리를 변경해야하는 경우 코드를 하위 코드로 실행하는 것이 좋습니다. 앞에 괄호를 묶고 cd "$j"(이름은 큰 따옴표로 묶어야 함) 장난을 만드는 cd ..괄호로 바꿉니다. 또한 왜 루트로 실행 했습니까? 그렇게 많은 피해를 입을 수 없어야합니다.
Jonathan Leffler

3
@ CarlosD.Zapata : cd ..put a 후 스크립트에서 명령을 pwd제거한 find다음 일반 사용자로 실행하십시오. /디렉토리가 아닌 파일이라고 생각하는 cd $ j를 수행하기 때문에 스크립트가로 들어가는 것을 볼 수 있습니다 . 따라서 각 루프에서 한 단계 뒤로 이동하여 마지막으로 있습니다 /.
Ravexina

1
@ CarlosD.Zapata /bin내부 폴더에서 작업하고 있었기 때문에 "중지"되었을 수 있습니다 /bin. 나는 그것들을 점검 할 것이다 (루트는 아니지만)
wizzwizz4

17
/ bin이 /의 첫 번째 폴더 (알파벳순으로 첫 번째 폴더) 였기 때문에 / bin에서 중지 된 후 mv더 이상 실행할 수 없었습니다 .
user253751

8

실행중인 터미널이 열려 있지 않은 경우이 문제를 해결하려면 먼저 bash 대신 사용할 수있는 "쉘 대체"를 찾으십시오. 파이썬은에 /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 ..스크립트에서 사용하지 마십시오 . 쉽게 그러한 문제를 일으킬 수 있습니다. subshell$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

물론 절대적으로 필요한 경우가 아니면 루트로 물건을 실행하지 마십시오.


다른 쉘 / 터미널에 액세스하지 않고도 파이썬과 같은 대화 형 쉘을 실행할 수 있습니까? 해결 방법은 암호와 함께 명령을 루트로 실행하는 스크립트를 작성해야한다고 생각합니다. GUI는 내가 추측하는 나머지를 할 것입니다.
Ravexina

@Ravexina : 모든 것이 쉘을 필요로하는 것은 아닙니다 . python프로세스 를 실행하려면 터미널 응용 프로그램 os.system("sudo ...")만 있으면되고 * nix 커널 만 있으면 실행 됩니다. 나중에 VM에서 시도해 볼 수도 있습니다.
leftaroundabout

또한 cd스크립트를 사용할 때 cd -한 디렉토리를 내려 놓았다고 가정하지 않고 일반적으로 현재 위치로 돌아가는 것이 좋습니다. 초기을 변경하는 경우 cd, 다음은 cd ..당신이 어디 있었는지에 백업하지만, 얻을 수 없습니다 cd -것입니다.
Frambot

같은 @JoeFrambach cd ..나는 것 없는 사용 cd -에만 명령 줄에서 스크립트. cd -아마도 문제보다 보증이 적을 수도 cd ..있지만 여전히 안전하다고 는 생각하지 않습니다. 누군가 중간에 디렉토리 변경을 더 추가하면 의도하지 않은 곳으로 이동합니다. 서브 쉘 은 디렉토리가 변경되는 위치와 되돌아가는 지점에 대해 명확하게 구분 된 범위 를 제공합니다 .
leftaroundabout

@ Ravexina 방금 시도했습니다 : Python을 실제로 시작할 수 있습니다. 그것은 os.system않습니다 하지 않고 일 sh현재,하지만 subprocess.call작동합니다.
leftaroundabout
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.