이상적으로는 이런 명령을 원합니다
rm --only-if-symlink link-to-file
실수로 파일을 여러 번 삭제했지만 해당 파일을 가리키는 심볼릭 링크는 삭제하지 않았기 때문입니다. sudo가 관련되어 있는 경우 이는 특히 나쁠 수 있습니다. 물론 나는 ls -al
그것이 정말로 심볼릭 링크인지 확인하기 위해 하나를 할 것입니다. 그러나 이것은 운영자 오류(예: 이름이 지정된 파일, 철자 오류 등) 및 경쟁 조건(누군가가 어떤 이유로 파일을 삭제하기를 원하는 경우)에 취약합니다. . 파일이 심볼릭 링크인지 확인하고 단 하나의 명령으로 삭제하는 방법이 있습니까?
답변1
$ rm_if_link(){ [ ! -L "$1" ] || rm -v "$1"; }
#test
$ touch nonlink; ln -s link
$ rm_if_link nonlink
$ rm_if_link link
removed 'link'
답변2
find
테스트 조건 을 사용할 수 있습니다 -type l
(발견된 개체가나잉크가 있는지 여부)
foo
예를 들어, 현재 디렉터리에 라는 파일이 있으면 다음과 같이 할 수 있습니다.
$ find . -type l -iname "foo" -delete
다음을 통해 단순화할 수 있습니다.
$ find . -maxdepth 1 -type l -delete
현재 디렉토리의 모든 심볼릭 링크가 삭제됩니다.
경고하다:
이 -delete
옵션 은 find
정말 위험합니다. 반드시 find 명령 끝에 넣으십시오. 위치를 잘못 지정하면 결과가 기준과 일치하는지 여부에 관계없이 찾은 모든 항목이 삭제됩니다.
의견에서 제안한 대로 find
및 의 조합을 사용하는 것이 더 안전한 옵션일 수 있습니다 rm -i
(파일 삭제를 확인해야 함).
$ $ find . -type l -iname "foo" | xargs rm -i
-exec trash {} \;
개인적으로 나도 당신처럼 과거에 화상을 입었 기 때문에 일시적으로 파일을 삭제하는 데 익숙합니다 . rm
더블은 잘못 놓인 깃발을 찾으러 나갑니다 -delete
.
답변3
zsh -c 'rm foo(@)'
@
는글로벌 예선;패턴은 foo(@)
일치하는 항목과 일치 foo
하지만 기호 링크만 일치합니다.
foo(-@)
끊어진 기호 링크만 일치됩니다. foo(@,L0)
심볼릭 링크와 빈 파일만 일치합니다.
물론 zsh를 먼저 실행한다면 rm foo(@)
. Enter입력하기 전에 누르지 않도록 주의해야 합니다 (@)
.