방금 홈 디렉토리의 모든 항목을 삭제했습니다. 어떻게? 일부 파일이 여전히 존재하는 이유는 무엇입니까?

방금 홈 디렉토리의 모든 항목을 삭제했습니다. 어떻게? 일부 파일이 여전히 존재하는 이유는 무엇입니까?

나에게 이런 일이 일어날 것이라고는 전혀 생각하지 못했지만, 여기 있습니다.¯\_(ツ)_/¯

소스 코드를 먼저 보지 않고 잘못된 디렉터리 내부의 저장소에서 빌드 스크립트를 실행했습니다. 스크립트는 다음과 같습니다 Scripts/BuildLocalWheelLinux.sh.

cd ../Dependencies/cpython
mkdir debug
cd debug
../configure --with-pydebug --enable-shared
make
cd ../../..

cd ..
mkdir -p cmake-build-local
cd cmake-build-local
rm -rf *
cmake .. -DMVDIST_ONLY=True -DMVPY_VERSION=0 -DMVDPG_VERSION=local_build
make -j
cd ..

cd Distribution
python3 BuildPythonWheel.py ../cmake-build-local/[redacted]/core.so 0
python3 -m ensurepip
python3 -m pip install --upgrade pip
[more pip install stuff]
python3 -m setup bdist_wheel --plat-name manylinux1_x86_64 --dist-dir ../dist
cd ..
cd Scripts

위험한 부분은 다음과 같습니다.

mkdir -p cmake-build-local
cd cmake-build-local
rm -rf *

그런데 곰곰히 생각해 보니 정말 안 될 일이 없을 것 같았습니다.

이 스크립트를 실행하는 방법은 입니다 cd Scripts; ./BuildLocalWheelLinux.sh. 처음 실행했을 때 마지막 줄에 오류가 표시되었습니다(나중에 알게 된 대로). 급해서 "어쩌면 문서가 오래됐을지도 모르니 프로젝트 루트에서 실행해 볼까 하는 생각이 들었습니다. 그래서 달렸습니다 ./Scripts/BuildLocalWheelLinux.sh. 갑자기 vscodes 테마와 확대/축소 레벨이 변경되고 zsh 터미널 구성이 재설정되었습니다. 터미널 글꼴이 기본값으로 변경되었고 무슨 일이 일어나고 있는지 깨닫고 Ctrl+C를 눌렀습니다.

파일이 몇 개 남아 있지만 명확한 패턴이 없습니다.

$ ls -la
total 216
drwx------ 27 felix   felix   4096 May 12 18:08 .
drwxr-xr-x  3 root    root    4096 Apr 15 16:39 ..
-rw-------  1 felix   felix  12752 Apr 19 11:07 .bash_history
-rw-r--r--  1 felix   felix   3980 Apr 15 13:40 .bashrc
drwxrwxrwx  7 felix   felix   4096 May 12 18:25 .cache
drwx------  8 felix   felix   4096 May 12 18:26 .config
drwx------  3 root    root    4096 Apr 13 21:40 .dbus
drwx------  2 felix   felix   4096 Apr 30 12:18 .docker
drwxr-xr-x  8 felix   felix   4096 Apr 15 13:40 .dotfiles
-rw-------  1 felix   felix   8980 Apr 13 18:10 examples.desktop
-rw-r--r--  1 felix   felix    196 Apr 19 15:19 .gitconfig
-rw-r--r--  1 felix   felix     55 Apr 16 13:56 .gitconfig.old
-rw-r--r--  1 felix   felix   1040 Apr 15 13:40 .gitmodules
drwx------  3 felix   felix   4096 May  6 10:10 .gnupg
-rw-r--r--  1 felix   felix   1848 May  5 14:24 heartbeat.tcl
-rw-------  1 felix   felix   1610 Apr 13 20:36 .ICEauthority
drwxr-xr-x  5 felix   felix   4096 Apr 21 16:39 .ipython
drwxr-xr-x  2 felix   felix   4096 May  4 09:35 .jupyter
-rw-------  1 felix   felix    161 Apr 27 14:23 .lesshst
drwx------  3 felix   felix   4096 May 12 18:08 .local
-rw-r--r--  1 felix   felix    140 Apr 29 17:54 minicom.log
drwx------  5 felix   felix   4096 Apr 13 18:25 .mozilla
drwxr-xr-x  2 felix   felix   4096 Apr 13 18:10 Music
drwxr-xr-x  6 felix   felix   4096 May 12 17:16 Nextcloud
-rw-r--r--  1 felix   felix     52 Apr 16 11:43 .nix-channels
-rw-------  1 felix   felix   1681 Apr 20 10:33 nohup.out
drwx------  3 felix   felix   4096 Apr 15 11:16 .pki
-rw-------  1 felix   felix    946 Apr 16 11:43 .profile
drwxr-xr-x  2 felix   felix   4096 Apr 13 18:10 Public
drwxr-xr-x  2 felix   felix   4096 May 12 18:08 .pylint.d
-rw-------  1 felix   felix   1984 May 12 18:06 .pythonhist
-rw-r--r--  1 felix   felix   2443 Apr 19 13:40 README.md
drwxr-xr-x 13 felix   felix   4096 May 12 18:08 repos
drwxr-xr-x  6 felix   felix   4096 Apr 19 11:08 snap
drwx------  3 felix   felix   4096 May  5 15:33 .ssh
drwxr-xr-x  5 felix   felix   4096 Apr 26 17:39 .stm32cubeide
drwxr-xr-x  5 felix   felix   4096 May  5 15:52 .stm32cubemx
drwxr-xr-x  2 felix   felix   4096 Apr 23 11:44 .stmcube
drwxr-xr-x  2 felix   felix   4096 Apr 13 18:10 Templates
drwxr-xr-x  3 felix   felix   4096 Apr 19 11:57 test
drwxr-xr-x  2 felix   felix   4096 Apr 13 18:10 Videos
-rw-------  1 felix   felix  14313 May 12 10:45 .viminfo
-rw-r--r--  1 felix   felix    816 Apr 15 13:40 .vimrc
drwxr-xr-x  3 felix   felix   4096 Apr 16 12:08 .vscode
-rw-r--r--  1 felix   felix   2321 Apr 19 18:47 weird_bug.txt
-rw-r--r--  1 felix   felix    162 Apr 15 13:40 .xprofile

.configPictures 및 Desktop과 같은 일부 표준 XDG 디렉토리는 사라졌지만 .bashrc는 여전히 존재합니다. .nix-channels여전히 존재하지만 .nix-defexpr핵무기에 의해 파괴되었습니다.

따라서 이는 두 가지 질문을 제기합니다.

  1. 무엇이 잘못되었나요?앞으로 이런 일이 발생하지 않도록 이 빌드 스크립트를 수정하고 홍보를 하고 싶습니다.
  2. 파일은 어떤 순서로 삭제되나요?분명히 알파벳순은 아니지만 *알파벳순으로 확장되어 있으므로 여기서는 다른 일이 벌어지고 있는 것처럼 보입니다.

답변1

아야.당신은 첫 번째 피해자가 아니다.

무엇이 잘못되었나요?

예를 들어 홈 디렉터리에서 시작 /home/felix하거나 /home/felix/src또는 에서 시작합니다 /home/felix/Downloads/src.

cd ../Dependencies/cpython

아무것도 없기 때문에 실패합니다 ../Dependencies.

mkdir debug
cd debug

debug이제 시작 디렉터리의 하위 디렉터리 에 있습니다 .

../configure --with-pydebug --enable-shared
make

../configure또는 이 없기 때문에 아무 작업도 수행되지 않습니다 make.

cd ../../..
cd ..

처음에 디렉터리 깊이가 세 수준 이하인 경우 cd debug네 번째 수준에 도달하면 현재 디렉터리는 이제 루트 디렉터리가 됩니다. 4개의 디렉토리 수준으로 시작한 경우 현재 디렉토리는 이제 입니다 /home.

mkdir -p cmake-build-local

/또는 쓰기 권한이 없기 때문에 이 작업은 실패합니다 /home.

cd cmake-build-local

디렉토리가 없기 때문에 실패합니다 cmake-build-local.

이제 우리는...

파일은 어떤 순서로 삭제되나요?

rm -rf *

이는 현재 디렉토리(예: /또는 ) 의 모든 파일을 재귀적으로 삭제하려고 시도합니다 /home. 홈 디렉터리는 알파벳순으로 열거되지만 아래 파일은 디렉터리 순회 순서에 관계없이 열거됩니다. 동일한 순서입니다 ls --sort=none( rm어떤 이유로든 다른 순서를 사용하기로 결정하지 않는 한). 이 순서는 일반적으로 백업에서 유지되지 않으며 디렉터리에서 파일이 생성되거나 삭제될 때 변경될 수 있습니다.

스크립트를 수정하는 방법

set -e첫째, 거의 모든 쉘 스크립트는 상단 근처에 위치해야 합니다 . set -e명령이 실패하면 스크립트가 중단됩니다. (종료 상태가 0이 아니면 명령이 실패합니다.) set -e작동하지 않는 상황이 있으므로 만병통치약은 아닙니다. 하지만 이는 여러분이 기대할 수 있는 최소값이며 여기서는 올바른 일을 수행합니다.

(스크립트는 다음으로 시작해야 합니다.셰르본#!/bin/sh또는 와 같이 사용할 셸을 나타내는 줄입니다 #!/bin/bash. 그러나 그것은 문제 해결에 도움이 되지 않습니다. )

rm -rf *, 또는 유사한 변형 rm -rf $foo.*( $foo결과가 비어 있으면 어떻게 되나요?)은 깨지기 쉽습니다. 대신 여기

mkdir -p cmake-build-local
cd cmake-build-local
rm -rf *

디렉터리를 삭제하고 다시 만드는 것이 더 안정적입니다. (이것은 디렉토리의 권한을 보존하지 않지만 여기서는 문제가 되지 않습니다.)

rm -rf cmake-build-local
mkdir cmake-build-local
cd cmake-build-local

make clean또 다른 접근 방식은 잘못된 파일을 삭제하는 데는 더 강력하지만 누락된 파일을 삭제하는 데는 더 취약합니다. rm알려진 빌드 대상과 알려진 확장명(가능한 것처럼)을 사용하여 명령을 실행하여 rm *.o빌드된 것으로 알려진 파일만 삭제합니다 .

답변2

cd스크립트를 실행 ~/Distribution/Scripts하고 각 호출이 성공한다고 가정하여 호출을 추적합니다 cd.

cd ../Dependencies/cpython

우리는 지금 ~/Distribution/Dependencies/cpython.

mkdir debug
cd debug

우리는 지금 ~/Distribution/Dependencies/cpython/debug.

cd ../../..

우리는 지금 ~/Distribution.

cd ..

이제 귀하의 홈 디렉토리에 있습니다.

mkdir -p cmake-build-local
cd cmake-build-local

우리는 지금 ~/cmake-build-local당신이 달리는 곳입니다 rm -rf *.

cd ..

이제 홈디렉토리로 돌아가자

cd Distribution

우리는 지금 ~/Distribution.

cd ..
cd Scripts

현재 단계입니다 ~/Scripts(예상했던 것보다 한 수준 높기 때문에 오류가 발생합니다).


그 다음에. 에서 동일한 스크립트를 실행하려고 합니다 ~/Distribution.

cd ../Dependencies/cpython

이것은 실패했습니다. 이로 인해 여전히 ~/Distribution.

mkdir debug
cd debug

당신은 지금 여기에 있습니다 ~/Distribution/debug.

cd ../../..

귀하는 현재 위치에 있습니다 ~/..(아마 위치 /home).

cd ..

당신은 아마 /지금 거기 있을 겁니다.

cd Distribution
mkdir -p cmake-build-local
cd cmake-build-local

"해당 파일 또는 디렉터리가 없습니다." 및 "권한이 거부되었습니다."로 인해 실패할 수 있습니다.

rm -rf *

사용자는 여전히 /해당 디렉토리에 있으며 rm명령은 전체 파일 시스템의 모든 파일을 삭제하려고 시도합니다. 권한은 쓰기 액세스 권한이 있는 디렉터리에 있는 파일만 삭제할 수 있도록 허용하므로 /tmp홈 디렉터리의 파일만 손실될 수 있습니다.

명령줄에 나열된 인수는 rm확장된 순서대로 처리됩니다 *(사전순, 즉 bin, boot, cdrom, devetc). 나열된 각 디렉터리는 "디렉터리 순서"(정렬되지 않음)에 따라 반복적으로 처리됩니다.


당신이 해야 할 일:

#!/bin/sh

topdir=$HOME/Distribution

mkdir -p "$topdir/Dependencies/cpython/debug"
(
    cd "$topdir/Dependencies/cpython/debug" || exit 1

    ../configure --with-pydebug --enable-shared
    make
)

rm -rf "$topdir/cmake-build-local"
mkdir -p "$topdir/cmake-build-local"
(
    cd "$topdir/cmake-build-local" || exit 1

    cmake .. -DMVDIST_ONLY=True -DMVPY_VERSION=0 -DMVDPG_VERSION=local_build
    make -j
)

(
    cd "$topdir" || exit 1

    python3 BuildPythonWheel.py ../cmake-build-local/[redacted]/core.so 0
    python3 -m ensurepip
    python3 -m pip install --upgrade pip
    python3 -m setup bdist_wheel --plat-name manylinux1_x86_64 --dist-dir ../dist
)

각 개별 하위 쉘의 작업 디렉토리는 ( ... )해당 하위 쉘의 로컬 디렉토리입니다. 서브쉘의 초기값은 cd"외부" 환경의 작업 디렉토리에 영향을 주지 않습니다. 나머지 코드에서는 사용자 쉘 세션의 초기 작업 디렉토리에 의존하지 않는 절대 경로 이름을 사용합니다. 특히 이 rm명령은 맹목적으로 확장하는 것이 아니라 *절대 경로를 통해 지정된 특정 디렉터리를 삭제한다는 점에 유의하세요. (디렉터리가 존재하지 않아도 치명적인 오류는 발생하지 않습니다.)

답변3

스크립트가 내부에서 실행되고 있다고 가정하면 Scripts이 중 어느 것도 스크립트 작성자가 의도한 대로 수행되지 않습니다.

cd ../Dependencies/cpython
mkdir debug
cd debug
cd ../../..
cd ..
mkdir -p cmake-build-local
cd cmake-build-local

첫 번째는 cd실패하고, 두 번째는 cd폴더로 이동한 다음 홈 디렉터리 위 어딘가에 놓을 것입니다(아마도 해당 디렉터리에는 cd ../../..일반적 으로 아무것도 만들 수 있는 권한이 없으므로 후속 작업 은 실패할 것입니다). 그런 다음 홈 디렉토리로 확장하여 내용을 반복적으로 작업하세요. 삭제 순서는 무작위입니다(디렉토리 항목은 특정 순서가 아닙니다).cd ../homemkdircd*rm -rf

관련 정보