/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진수 시퀀스와 일치함 ).x
y
ksh
+([0-9])
(D)
숨겨진 파일(또는 파일)을 포함하는D
glob 한정자(^-/)
글로벌 예선심볼릭 링크 확인 후 디렉터리 유형이 아닌 파일만(-
디렉토리에 대한 심볼릭 링크도 제거하려면 이 항목을 제거하십시오.)
답변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