2009-06-12 3 views
1

오늘 저는 동료의 홈 디렉토리를 부분적으로 실수로 삭제할 가능성을 처음 보았습니다 (프로젝트의 중요한 단계에서 2 시간이 손실 됨). 나는 문제에 대해 가능한 해결책을 생각하기 시작했다.우발적 인 삭제를 방지합니다.

'~'라는 파일이 어떻게 든 test 폴더에 들어갔다. rm -rf로 삭제 한 후 ... rm이 파일에 도착했을 때 bash가 홈 폴더로 확장했다 (CTRL- 거의 시간 내에 C). '*'라는 파일이 있으면 비슷한 문제가 발생할 수 있습니다.

첫 번째 생각은 "위험한 이름"이 포함 된 파일 생성을 막는 것이었지만 mv 또는 다른 구석 상황이 위험한 상황을 초래할 수 있으므로 문제가 해결되지 않습니다.

두 번째 생각은 청취자를 생성하는 것입니다 (이것이 가능한지 모르는 경우). 또는 처리중인 파일을 검사하는 rm의 별칭. 위험한 파일을 찾으면 건너 뛰고 메시지를 보내지 않습니다. 이와 유사한 뭔가 :

  1. (그래서 하나를 삭제하고 싶은 파일을 얻을 수 있습니다) 현재 항목이 위험한 항목에 동일한 경우는이 항목에
  2. 검사를
  3. 주기를 (이외의 모든 매개 변수 인수를 예를 들어 '~'또는 '*'), 이것이 작동하는지 모르겠다면,이 시점에서 항목이 이미 확장 되었습니까?
  4. 메시지를 에코 그렇다면,
  5. 이 반복

셋째 생각을 계속 파일에 아무것도하지 않는 : 사람이 이미 완료 또는이와 dealed있다? :]

답변

7

실제로 홈 디렉토리의 중요한 파일을 소스 제어에 체크 표시하는 것이 좋습니다. 방금 발생한 상황에 대한 보호뿐만 아니라 .bashrc 등의 버전 제어가 가능하다는 점이 좋습니다.

0

버전 제어 제안은 저에게 upvote를 가져옵니다. 나는 모든 것을 위해 그것을 권하고 싶습니다. 단지 소스가 아닙니다.

또 다른 생각은 백업되고 보관 된 서버의 공유 드라이브입니다.

세 번째 아이디어는 모두가 로컬 드라이브를 백업 할 수 있도록 개별 외장 하드 드라이브를 구입하는 것입니다. 하드 드라이브에는 두 가지 종류가 있습니다. 실패한 드라이브와 장래의 드라이브입니다.

0

rm에서 모든 문자를 이스케이프 처리하는 간단한 스크립트를 실행하는 별칭을 만들 수도 있습니다. 이로 인해 실제로 와일드 카드를 사용할 수 없게됩니다. 그런 다음 이스케이프하지 않고 실제 rm을 통해 실행되는 다른 별칭을 만듭니다. 당신이 정말로 확실하다면 당신은 초를 사용할 것입니다. 그런 다음 다시 rm -rf의 포인트입니다.

제가 개인적으로 좋아하는 또 다른 옵션은 스크립트를 통해 리디렉션 한 다음 모든 것을 rm에 전달하는 것입니다. 스크립트가 위험한 문자를 발견하면 계속하려면 Y/N을, N은 작업을 취소하고 Y는 정상적으로 계속하라는 메시지를 표시합니다.

2

쉘이 매개 변수를 확장 할 것이므로 '위험한'이름을 실제로 잡을 수는 없습니다.

'rm -rf'를 'rm -rfi'(대화식)로 별칭을 지정할 수 있지만 실제로 'rm -rf *'를 의미하는 경우 매우 지루할 수 있습니다.

'rm'을 'mv $ @ $ HOME/.thrash'의 별칭으로 지정할 수 있으며 스 래시를 비우기위한 별도의 명령이 있지만 디스크 할당량 때문에 파일을 제거하려는 경우 문제가 발생할 수 있습니다. 비슷한.

아니면 그냥 적절한 백업을 유지하거나 "삭제 취소"할 수있는 파일 시스템을 사용할 수 있습니다.

+0

아마도 "쓰레기"대신 "쓰레기"를 의미 할 것입니다. –

2

사고가 발생합니다. 당신은 그 (것)들의 충격을 단지 감소시킬 수있다.

버전 제어 (일반 체크인)와 백업은 모두 여기에서 매우 중요합니다.

(아직 작동하지 않기 때문에) 체크인 할 수 없으면 USB 스틱에 백업합니다.

그리고 마감 기한이 지난다면 머피가 가장 부적절한시기에 공격하기 때문에 백업 빈도가 증가합니다.

1

내가하는 한 가지는 항상 내 $ HOME에 "-i"이라는 파일이 있습니다.

다른 팁은 평야 대신 "./*"또는 find을 항상 사용하는 것입니다. "*"

0

내가 근무한 회사 중 한 곳에서 매주 30 분마다 실행되는 cron 작업이 있었는데, 모든 소스 코드를 모든 사람의 홈 디렉토리에서 시스템의 다른 곳에 백업 디렉토리 구조로 복사했습니다 (find).

실제 삭제를 막지는 못했지만 여러 차례 잃어버린 작업을 최소화했습니다.

0

정말 이상한 행동입니다. 왜 배시가 두 번 확장되는 거죠?

일단 *이

old~ 
this~ 
~ 

로 확장했다에게 더 이상의 대체가 일어나지한다!

나는 내 Mac에서 이것을 용감하게 테스트했으며, ~, 내 홈 디렉토리가 아니라 삭제되었습니다.

동료가 어떻게 두 번 확장 한 코드를 작성할 수 있습니까?

ls | xargs | rm -rf 
+0

아니요, 두 번이 아니며 '~'이라는 파일을 가지고 있습니다. 비슷한 * 때문에 '*'사례를 추가했습니다. –

0

당신은 파일 이름 생성 (로빙) 비활성화 할 수 있습니다 : 파일 경로에 특수 문자를 이스케이프

set -f 

를 갈라 내장 명령어와 함께 할 수있다 : 내에서 이것을 사용

filepath='/abc*?~def' 
filepath="$(printf "%q" "${filepath}")" 
filepath="${filepath//\~/\\~}" 
printf "%s\n" "${filepath}" 
0

~ /.basrc

별칭 rm = "rm -i"

rm은 아무 것도 삭제하기 전에 프롬프트를 표시하며 별명은 -f 플래그 또는 escabing으로 회피 될 수 있습니다. \ rm 파일

문제가 악화됩니다. 예; 그것을 해결합니다.

+0

이 문제는 결국 각 파일의 삭제에 대해 물어 보는 것에 지쳐서 \ rm에 의지한다는 것입니다. 실수로 \ rm -rf를 발행하는 것은 시간 문제 일뿐입니다. – Michael

관련 문제