심볼릭 링크 인 경우에만 파일 제거


11

이상적으로는 이런 명령을 원합니다

rm --only-if-symlink link-to-file

파일을 가리키는 심볼릭 링크 대신 파일을 실수로 너무 많이 태워 버렸기 때문입니다. sudo가 관련된 경우 특히 나쁠 수 있습니다. 이제는 ls -al실제로 심볼릭 링크인지 확인하기 위해 수행 하지만 연산자 오류 (유사한 파일, 오타 등) 및 경쟁 조건 (누군가가 어떤 이유로 파일을 삭제하기를 원한 경우)에 취약합니다. 파일이 심볼릭 링크인지 확인하고 하나의 명령에있는 경우에만 파일을 삭제하는 방법이 있습니까?


1
경쟁 조건이 관심사라고 생각하지 않습니다. 심볼릭 링크를 제거하고 파일로 대체 할 수있는 사람은 디렉토리에 대한 쓰기 권한이 필요하므로 파일을 직접 삭제할 수도 있습니다.
Nate Eldredge

답변:


19
 $ rm_if_link(){ [ ! -L "$1" ] || rm -v "$1"; }

 #test
 $ touch nonlink; ln -s link
 $ rm_if_link nonlink
 $ rm_if_link link
   removed 'link'     

4
확실히 제거 !하고 다음 ||으로 변경 하는 것이 더 분명 할 것입니다&&
glenn jackman

5
@glennjackman ||양식 을 선호하는 습관을 들였습니다 . &&당신이 set -e모드에있는 경우 물건을 가져옵니다 .
PSkocik

@PSkocik 일반적으로 위험한 경우 (파일이 존재하고 심볼릭 링크 인 경우)와 [ ! -L $1 ]유효하지 않은 연산자 ( [ ! -l foo ]) 또는 심지어 구문 오류 ( [ ! -q foo || echo foo)
l0b0

2
@XiongChiamiov 문제 rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }는 비 링크 set -e 모드로 실행하면 셸 프로세스가 종료된다는 것입니다. 추가 할 수는 || :있지만 IMHO가 ! ||버전 보다 훨씬 명확 하지 rm않아서에서 실패로 인해 사용자를 죽이는 것을 방지 할 수 있습니다 set -e. ! ||매우 간결하고 명확하며 이러한 문제로 고통받지 않습니다.
PSkocik

1
아뇨 . 다른 옵션 : a) rm테스트 내부에 넣음 , b) 실제 if 문 사용, c) -e대화식 쉘 내부 에서 사용하지 마십시오 (그리고 스크립트를 테스트하십시오!). 가독성에 대해 논쟁하고 싶다면, if무언가가 링크인지 테스트하는 것이 승자입니다.
Monica Cellio의 보이콧 SE 23. 16.

5

당신은 사용할 수 있습니다 find-type l테스트 조건 (개체가 발견 있는지 확인하기 위해 테스트하는 것입니다 리터의 잉크 없음)

예를 들어, foo현재 디렉토리에 파일 이 있으면이 작업을 수행 할 수 있습니다.

$ find . -type l -iname "foo" -delete

다음과 같이 간단히 단순화 할 수 있습니다.

$ find . -maxdepth 1 -type l -delete

현재 디렉토리의 모든 심볼릭 링크를 삭제합니다.

경고:

-delete에서 옵션find 정말 위험합니다. 찾기 명령의 끝에 IT를 배치하십시오. 잘못 배치하면 결과가 조건과 일치하는지 여부에 관계없이 찾은 모든 항목이 삭제됩니다.

의견에서 제안했듯이 더 안전한 옵션은 conjuction에서 ( findrm -i파일 제거를 확인하도록 강제하는) 것입니다.

$ $ find . -type l -iname "foo" | xargs rm -i

개인적으로 나는 과거 -exec trash {} \;처럼 불에 타서 파일을 일시적으로 삭제 하는 데 사용 합니다 rm. 잘못 배치 된 -delete깃발을 두 번갑니다 .

http://slackermedia.ml/trashy


1
-delete 대신 그냥 인쇄해서 xargs로 넘길 수 있습니다 : find . -type l -iname "foo" | xargs rm -i 더 안전합니다.
Boban P.

1
rm -i안전 을 위해 @BobanP.를 사용하는 것이 좋습니다 .
Klaatu von Schlacker

3
"이것은 현재 디렉토리의 모든 심볼릭 링크를 삭제합니다"... 그리고 그 아래 지점.
Joseph R.

1
@JosephR로. 그것은 길을 끝까지 갈 것이라고 말했다. 찾기에 -maxdepth 1을 추가하십시오.
Boban P.

1
공백이있는 파일 이름은 여전히 ​​끊어집니다. -print0for find-0for 사용 을 제안하십시오 xargs.
와일드 카드

4
zsh -c 'rm foo(@)'

@A는 글로브 규정은 ; 패턴은 foo(@)일치하는 항목 foo과 일치하지만 기호 링크 만 일치합니다.

foo(-@)깨진 심볼릭 링크와 만 일치합니다. foo(@,L0)기호 링크 및 빈 파일 만 일치합니다.

물론 처음에 zsh를 실행하는 경우을 입력하면 rm foo(@)됩니다. Enter입력하기 전에 누르지 않도록주의해야합니다 (@).


1
Zsh는 이와 같은 답변을 볼 때 점점 더 강력하게 들립니다.
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.