Linux에서 실행 취소가 있습니까?


답변:


53

다른 유니 세와 마찬가지로 Linux는 기본적으로 실행 취소 기능을 제공하지 않습니다. 철학은 사라지면 사라진다는 것입니다. 중요한 경우 백업되어야합니다.

이전 버전의 사본을 자동으로 유지하는 퓨즈 파일 시스템이 있습니다 : copyfs , 모든 배포판에서 사용 가능합니다. 물론 많은 리소스를 사용할 수 있습니다.

이러한 사고를 방지하는 가장 좋은 방법은 버전 제어 시스템 (cvs, bazaar, darcs, git, mercurial, subversion 등)을 사용하는 것입니다. 배우는 데 약간의 시간이 걸리지 만, 중장기 적으로는 대가를 치릅니다.


1
좋은 대안으로 개발되어 아래 gitfs, 수 있습니다
test30

1
만약 당신이 실수로 아직 준비하거나 커밋하지 않은 파일을 삭제하거나 덮어 쓴다면 CVS조차 도움이되지 않습니다
xdevs23

14

불행하게도.


19
유감스럽게 생각합니다. 실행 취소를 구현하려면 약간의 리소스가 필요합니다. 기본적 -i으로 rm활성화 된 옵션을 좋아하지 않습니다 . 내 유닉스 시스템은 내 손을 잡아서는 안됩니다.
xenoterracide

5
-i는 기본적으로 활성화되어 있습니까?! 내 배포판이 아닙니다.
Stefan

9

어떤 유닉스에서도 마법의 실행 취소가 없습니다. 유닉스는 당신이하고있는 것을 알고 있다고 가정합니다. 실행 취소 지원을 위해 VCS를 사용하십시오 (텍스트 편집기에도 내장되어있을 수 있습니다).

대부분의 파일 시스템에는 투명하게 수행 할 수있는 기능이 없습니다.

Mac과 Windows에서 타임머신과 시스템 복원은 각각 백업 / 변경 제어 시스템입니다.


7

명령 행에는 실행 취소가 없습니다. 그러나 rm -i및로 명령을 실행할 수 있습니다 mv -i. "확실합니까?"라는 메시지가 표시됩니다. 그들이 명령을 실행하기 전에 질문하십시오.

시작 스크립트에 별칭을 추가 할 수도 있습니다 (예 : ~/.bashrc또는 /etc/bash.bashrc).

alias remove='rm -i'
alias move='mv -i'

편집 : 아래 제안에 따라 기본 명령의 별칭을 지정하라는 조언을 제거했습니다. 대신, 지금 새로운 명령을 소개합니다).


1
+1. 여기에 추가하십시오. 위의 별명을 설정 한 후 "확실히"프롬프트없이 직접 제거하려면 \ rm 및 \ mv를 사용하여 별명을 무시할 수 있습니다. -f 옵션을 사용할 수도 있습니다.
Hemant

2
mv -i파일을 덮어 쓸 때만 묻습니다 (유용하고 불분명하지 않음). 같은 맥락에서 alias cp='cp -i'.
Gilles 'SO- 악마 그만'

8
rm과 mv를 앨리어싱하는 것은 매우 나쁜 생각입니다. (rm은 모두 최악입니다.) rm -i를 의미하기 위해 rm을 사용하는 습관을 가지지 마십시오. 결국 별칭이 정의되지 않은 곳에서 사용하고 좋은 것을 삭제합니다. 프롬프트가 표시되는 경우 항상 rm -i를 사용하는 습관을 가지십시오.
msakr

프롬프트가 표시되면 다른 이름으로 별명을 사용하십시오. move = 'mv -i', copy = 'cp -i', symlink = 'ln -si'를 사용하고 rm 대신 사용할 휴지통 명령을 설치하십시오. 스크립팅 할 때 여전히 mv, cp 및 rm을 직접 사용하지만 대화 형 사용의 경우 이러한 별칭이 편리합니다.

@mahmoudsakr 당신은 완전히 맞아요, 그 시점을 놓쳤습니다. 이 명령에도 별칭이 없습니다. 다른 명령으로 별칭을 지정하면 가장 제정신 옵션처럼 보입니다!
vdboor

4

Linux / Unix 시스템에 삭제 취소 기능이없는 이유는 대부분의 파일 시스템이 정보를 저장하는 방식에서 비롯됩니다. 파일 메타 정보는 디스크의 나머지 부분에있는 inode에 대한 참조와 함께 디스크의 전면에 저장됩니다. 일반적으로 대부분의 파일 시스템은이 메타 영역의 파일에 10 개의 블록을 할당합니다. 처음 7은 처음 7 개의 inode를 나타냅니다. 8 번째와 9 번째는 inode 목록 (확실히 연결된 블록)으로 이동하고 10 번째는 목록 (목록으로 3 배 연결된 블록) 목록으로 이동합니다. 이것은 파일 시스템마다 다르지만 (ext4, jfs, xfs 등) 이러한 블록 목록은 일반적으로 2GB에서 몇 TB에 이르는 파일 크기를 지정할 수 있습니다.

그러나이 모든 정보는 디스크의 전면에 저장되므로 파일을 지울 때 디스크의 inode를 어떤 메타 데이터에 속하는지 참조 할 방법이 없습니다. 반면 FAT32와 NTFS는 실제로 일부 헤더 정보를 파일 자체와 함께 저장하여 블록 세트에 속하는 파일이 무엇인지 쉽게 식별 할 수 있습니다 (새로운 파일이 공간을 확보하지 않는 한). 리눅스 작업에서 무언가를 삭제할 때 효율성을 위해 새로운 데이터로 즉시 덮어 쓰는 것이 항상 가장 먼저입니다.


2

실행 취소 기능을 원한다면 소스 컨트롤을 사용하십시오. Subversion은 실제로 단일 사용자 컴퓨터에서 매우 잘 작동합니다. 홈 시스템의 모든 개인 파일을 제어하는 ​​데 사용합니다. 재난이 발생하기 전까지는 잔인한 것처럼 보이거나 불량한 스크립트 나 명령 줄 오타가 발생합니다.


1
rm -r .그래도 당신을 보호하지는 않습니다 . ;)
Umang

1
@ Umang 실제로 로컬 저장소를 유지하고 실수로 git으로 한 번 수행했습니다 rm -r project.git. 다행히도 발생하지 않을 원격 서버에 다른 버전을 유지하는 경우
phunehehe

1
@ phunehehe와 누구든지 내 의견을 +1했습니다 : 우리는 내가 완전히 틀렸다는 것을 깨닫기 위해 DVCS에 너무 익숙합니다. SVN은 저장소가 아닌 지점에 커밋합니다. 그래서 당신 실제로 보호받을 것 rm -r .입니다. 정말 바보 야
Umang

2

.bashrc에 추가하고 싶은 한 가지는 복사 및 제거 기능입니다. 다음과 같은 것 :

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

그러나 rm이 아닌 cprm을 입력하는 습관을 들여야합니다.

디스크 공간이 제한되어 있으면 삭제 된 영역을 유지해야합니다.


4
mv $ 1 ~ / deleted / $ 1로 단축 할 수 있습니다.
Stefan

예, 인용 부호가 있으면 '새 문서 1'파일을 다른 새 문서 1로 덮어 씁니다 "$1".
사용자 알 수 없음

@userunknown : Deano 's에서 $ 1이고 Stefan의 코드가 "$ 1"로 인용되어야합니까?
Tim

@ 팀 : 예, 그렇습니다.
사용자가 알 수 없음

cp와 rm 대신 이동하지 않는 이유는 무엇입니까?
user1559897

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.