모든 하위 디렉터리(및 그 안의 파일)를 삭제하려고 합니다.아니요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 {} +
이 모든 명령은 콘텐츠를 삭제합니다. 사용 전 테스트해보세요!