~로 끝나는 임시 파일을 삭제하는 명령


15

며칠 전에이 유용한 bash 별칭 ( ~ ~ .bash_aliases의 내용 )을 찾았습니다.

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

지금은 사용하려 rm~후에 cd끝나는 3 파일이 포함 된 일부 디렉토리~

터미널 에서이 오류가 발생하여 파일이 삭제되지 않았습니다.

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

또한 rm~에서 시도했을 때 /home/me아무것도하지 않는 것 같습니다. 또는 시간이 오래 걸릴 수 있습니다.

오류가 발생하는 이유와 해결 방법을 알려주십시오.

감사!

답변:


26

bash 별칭이 제대로 작성되지 않았습니다 (작은 따옴표는 잘 사용되지 않음). 대신 다음과 같아야합니다.

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

이제 개인적으로 쓸모없는 파이프 사용을 좋아하지 않으므로 xargs별칭을 다음과 같이 작성하는 것이 좋습니다.

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

-type f옵션 파일 만 (안 등 디렉토리, 링크)에서 찾을 수 있도록 -v하는 옵션 rm자세한 정보 (무엇의 삭제 밖으로 인쇄) 할 수 있도록로합니다. +끝에 그래서 find실행 rm발견 된 모든 파일과 (하나 개의 인스턴스 만 급부상 rm, 대신 파일 당 하나).

지금부터 man bash:

거의 모든 목적에서 별명은 쉘 기능으로 대체됩니다.

대신 별명으로,이 기능을 사용하는 것이 좋습니다 :에 주석에 별칭 .bash_aliases파일 (즉,을 넣어 #그 라인의 앞에), 그리고 파일 .bashrc이 넣어 기능 (끝이 괜찮 어디서나 파일에) :

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

또한 다른 답변에서 언급했듯이 -delete명령을 사용하여 찾을 수 있습니다. 이 경우 rm~기능은 다음과 같습니다.

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

실제로, 당신은 인수를 취할 멋진 함수를 만들 수 있습니다 --dry-run.

rm~() {
    case "$1" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

그런 다음 다음과 같이 사용하십시오.

rm~ --dry-run

삭제 될 파일 만 표시하고 삭제하지는 않습니다.

rm~

당신이 이것에 만족할 때.

필요에 맞게 조정하고 확장하십시오!

노트. 변경 사항을 적용하려면 새 터미널을 열어야합니다.


감사! 그것은 잘 작동하고 드라이 런 은 매우 도움이됩니다.
Vinayak Garg

2
find -type f -name '*~' -delete(선택 무기, 외에 git clean -dfx .)
sehe

2
이것은 매우 우아한 솔루션입니다. 소품을 제공하기 위해 로그인해야했습니다. 내 좋은 친구, 당신에게 +1!
CodeChimp

9

*~별명에 할당되기 전에 쉘에 의해 확장됩니다. 실제 과제는 다음과 같습니다.

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

별명 대신 함수를 사용하는 것이 좋습니다. 인용 부호와 관련하여 훨씬 강력하고 다루기가 더 쉽습니다.

우리가 거기에있는 동안 불필요한 옵션을 제거하고 .(매개 변수가 제공되지 않으면 현재 디렉토리가 암시적임) 옵션이 이미 존재 xargs하므로 학대를 중지하십시오 -delete.

rm~() { find -name '*~' -ls -delete; }

-ls옵션은 선택 사항이지만 추가하면 삭제 된 파일이 표시됩니다.


+1 감사합니다! 그러나이 기능을 어디에 추가합니까?
Vinayak Garg

@VinayakGarg 당신은 당신 .bash_aliases도 그것을 추가 할 수 있지만, 나는 보통 내 똑바로 넣어 .bashrc.
Lekensteyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.