최상위 디지털 디렉터리를 제외한 모든 항목을 삭제하려면 어떻게 해야 합니까?

최상위 디지털 디렉터리를 제외한 모든 항목을 삭제하려면 어떻게 해야 합니까?

/path/to/foo메타 패턴과 일치하는 하위 디렉터리를 제외하고 디렉터리 아래의 모든 항목을 삭제하고 싶습니다.

/path/to/foo/<DIGITS>/

예를 들어, 다음이 /path/to/foo원래 다음과 같다면:

/path/to/foo
├── 0/
│   ├── a
│   └── b
├── 232532/
├── 42
├── 73/
│   ├── d
│   └── e
├── 8xyz/
│   ├── i
│   └── j
├── _bar/
│   ├── x
│   ├── y
│   └── z
├── .baz/
│   ├── f
│   └── frobozz/
│       ├── g
│       └── h
└── quux/
    └── 123/

...끝내고 싶어

/path/to/foo
├── 0/
│   ├── a
│   └── b
├── 232532/
└── 73/
    ├── d
    └── e

나는 이를 수행할 수 있는 find ... -delete- 기반 주문 또는 적합한 zsh전역 패턴( 에 대한 )을 찾고 있습니다 . rm -r저는 리눅스를 사용하고 있습니다.

답변1

그리고 zsh:

set -o extendedglob # best in ~/.zshrc
rm -rf /path/to/foo/^<->(D) /path/to/foo/<->(^-/)
  • ^something뭔가가 아니다(비슷 ksh하다 !(something))
  • <->는 에서 까지 <x-y>의 10진수 정수와 일치 하지만 경계를 제공하지 않습니다(따라서 's 와 유사한 모든 10진수 시퀀스와 일치함 ).xyksh+([0-9])
  • (D)숨겨진 파일(또는 파일)을 포함하는 Dglob 한정자
  • (^-/)글로벌 예선심볼릭 링크 확인 후 디렉터리 유형이 아닌 파일만( -디렉토리에 대한 심볼릭 링크도 제거하려면 이 항목을 제거하십시오.)

답변2

GNU에 액세스할 수 있는 경우 다음을 find실행할 수 있습니다.

find . -maxdepth 1 -not \( -type d -regex '.*/[0-9]*$' \) -exec rm -r {} +

아이디어는 i) 디렉토리가 아니고 ii) 이름이 숫자로만 구성된 최상위 파일을 찾는 것입니다.

무슨 일이 일어나는지 보는 echo것보다 한 번 실행해 보는 것이 좋습니다 .rm -r

답변3

cd /path/to/foo && \
find . -maxdepth 1 ! -type d -delete -o \
   ! -name . -name '*[!0-9]*' -exec rm -rf {} +

내용은 다음과 같습니다.

  • /path/to/foo 디렉터리로 전환하고 해당 디렉터리에 성공적으로 진입합니다.
  • 호출은 find한 수준 깊이로만 진행되며 그 안에 있는 디렉터리가 아닌 모든 항목을 제거합니다.
  • 다른 모든 하위 디렉터리, 즉 /path/to/foo 디렉터리 내의 하위 디렉터리의 경우 이름이 "."인 항목을 거부하고 숫자가 아닌 항목이 하나 이상 포함된 항목을 선택합니다.
  • 선택된 카탈로그는 도살장으로 전달되어 디지털 전용 카탈로그의 생존을 보장합니다.

답변4

find ./* ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete

또는 foo파일이 너무 많아 매개변수 제한 초과가 발생하는 경우 다음을 사용하십시오.

find . ! -path . ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete

관련 정보