GNU find with -exec rm은 일치 항목을 제거한 다음 존재하지 않는다고 불평합니다.


4

나는 /domains 내가 같은 항목을 가지고있는 디렉토리

theawesomesite.com
0.2.v.theawesomesite.com
0.3.v.theawesomesite.com

0.3을 테스트 한 후 주 도메인을 새 버전의 별칭으로 설정합니다. 정말 잘 작동합니다. 이제 모든 이전 버전을 삭제할 수 있기를 원합니다. 나는 이것을 시도 :

find /domains -name "*.v.theawesomesite.com" -not -name "0.3.v.*" -ignore_readdir_race -exec rm -fr {} \;

이전 도메인 디렉토리는 삭제되지만 각 도메인 디렉토리는 삭제됩니다. find 불평하다 No such file or directory. 나는 -ignore_readdir_race 그 아이디어 아래서 도움이 될 것이지만, 그렇지는 않습니다.

모든 불만 사항을 제거하는 방법과 그 이유 find 처음부터 불평하고있다. 그건 그래야만 해 stat 후에 -exec 그러나 나는 이유를 알 수 없다.

답변:


3

다음을 추가하십시오. -depth 플래그를 사용하여 디렉토리 자체 앞에있는 각 디렉토리의 내용을 처리합니다.

Asker에 의해 편집 : 또는, -prune 플래그, 나는 내용에 전혀 신경 쓰지 않습니다. 귀하의 제안에 따라 디렉토리를 삭제 한 후 해당 디렉토리를 검색하는 것에 대해 생각하게 만들었지 만 고려하지 않았기 때문에 나에게 최종 답변을주었습니다. 그래서 나는 이것을 실제로 사용 된 정답으로하고 싶습니다.


1

너는 사용할 수있어. -delete 대신에 행동 -exec (당신이 최근에 찾은 한).


1

찾기는 디렉토리를 재귀해야 할 때 저장되는 것이 가장 좋습니다. 이 경우에는 쉘 마법을 사용합니다. 옵션에는 다음이 포함됩니다.

for dir in *.v.theawesomesite.com
    [[ $dir == 0.3.v.theawesomesite.com ]] || rm -r $dir
done

또는:

echo *.v.theawesomesite.com | grep -v '^0.3.v.theawesomesite.com$' | xargs rm -r

또는:

mv 0.3.v.theawesomesite.com 0.3.v.theawesomesite.com.SAVED
rm -r *.v.theawesomesite.com
mv 0.3.v.theawesomesite.com.SAVED 0.3.v.theawesomesite.com

0

큰 따옴표 대신 작은 따옴표를 사용해보십시오.

셸은 큰 따옴표를 전달하기 전에 큰 따옴표를 확장합니다. find, 그래서 그것은 파일 앞에 rm'ing 디렉토리 일 수 있습니다 :

find /domains -name 0.2.v.theawesomesite.com 0.2.v.theawesomesite.com/file1 ...

따라서 먼저 디렉토리를 처리 한 다음 방금 삭제 한 파일을 찾습니다.

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