OSX에서 패턴을 포함하지 않는 하위 디렉터리를 반복적으로 삭제합니다.

OSX에서 패턴을 포함하지 않는 하위 디렉터리를 반복적으로 삭제합니다.

모든 하위 디렉터리(및 그 안의 파일)를 삭제하려고 합니다.아니요OSX에서 Bash를 사용하면 디렉터리 이름에 두 가지 패턴 중 하나가 포함됩니다. 나는 여러 상위 디렉토리에 대해 이 작업을 재귀적으로 수행하려고 합니다.

내가 원하는 하위 디렉터리의 패턴을 가정해 보겠습니다.아니요삭제는 "foobar" 또는 "doobar"입니다.

다음과 같은 상위 디렉토리가 많이 있습니다.

Parent001_dir
   001_boo
   002_hugs
   003_foobar
   004_doobar
   005_apple
   ...

각 상위 디렉터리로 이동하여 일치하지 않는 하위 디렉터리를 삭제하는 for 루프 코드를 실행하고 싶습니다.

내가 생각하는 작동할 코드:

for i in /path/to/parent/directories/
do
find !-name "*foobar*" -o !-name "*doobar*"  -delete
done

하지만 찾기 설명서를 읽었는데 옵션이 표시되지 않았습니다.아니요패턴 일치; !-name은 옵션이 아닙니다.

편집 - 댓글에서 다음을 시도해 보세요.

find /path/to/parent/directories/ -type d -not -name "*foobar*" -not -name "*doobar*"  -delete

"경로가 안전하지 않을 수 있습니다"라는 메시지가 나타납니다.

내 코드를 수정하는 방법을 찾으면 'Parent001_dir'과 다음과 같은 다른 모든 상위 디렉터리로 끝날 수 있습니다.'

Parent001_dir
   003_foobar
   004_doobar

내 코드를 수정할 수 있는 와일드카드가 있나요? 아니면 완전히 다른 방법을 사용해야 합니까? 도움을 주셔서 미리 감사드립니다.

답변1

첫째, 루프가 필요하지 않으며 find이 모든 작업을 자체적으로 수행합니다. !또는 -not플래그를 사용하여 조건을 무효화 할 수 있습니다 . -o이는 "이름이 foobar가 아니거나 이름이 doobar가 아닌 파일/디렉토리를 찾는 것"을 의미하기 때문에 당신도 그것을 원하지 않습니다 . 이는 하나 또는 다른 조건이 항상 true이기 때문에 모든 것을 찾습니다( foobar"not doobar"와 일치하고 doobar"not foobar"와 일치). 당신이 원하는 것은 다음과 같습니다.

find /path/to/parent/dirs/* -type d ! -name "*foobar*" ! -name "*doobar*" -delete

또는

find /path/to/parent/dirs/* -type -d -not -name "*foobar*" -not -name "*doobar*" -delete

원하는 경우 셸에서 이 작업을 수행할 수도 있습니다. 예를 들어 다음을 사용합니다 bash.

for i in /path/to/parent/dirs/*/; do 
    [[ "$i" =~ 'foobar' || "$i" =~ 'doobar' ]] || rm -rf "$i"; 
done

자세한 내용은 잘 모르겠고 이것을 테스트할 Mac도 없지만 OSX find에서는 디렉토리 삭제를 허용하지 않는 것 같습니다. 나는 그것이 사실이라고 믿는다(그러나 확실하지는 않다)이 코드하다:

/* Potentially unsafe - do not accept relative paths whatsoever */
if (strchr(entry->fts_accpath, '/') != NULL)
    errx(1, "-delete: %s: relative path potentially not safe",
        entry->fts_accpath);

이 문제를 해결하는 한 가지 방법은 다음을 사용하는 것입니다 -exec.

find /path/to/parent/dirs/ -type d ! -name "*foobar*" ! -name "*doobar*"  \
    -exec rm -rf {} +

이 모든 명령은 콘텐츠를 삭제합니다. 사용 전 테스트해보세요!

관련 정보