pdf
나는 그 안에 많은 파일이 들어있는 큰 나무를 가지고 있습니다 . 이 트리에서 파일을 삭제하고 싶지만 내부에 다른 유형의 파일도 있는 하위 폴더 pdf
에서만 삭제하고 싶습니다 . 이 하위 폴더에는 다른 하위 폴더가 없습니다.pdf
rules/
rules/
rules/
예를 들어, 저는 이런 나무를 가지고 있습니다. "소스" 아래의 모든 내용
source/
A/
rules/*.pdf, *.txt, *.c,etc..
etc/
B/
keep_this.pdf
rules/*.pdf
whatever/
C/
D/
rules/*.pdf
something/
등. 어디에나 파일이 있지만 다른 곳은 삭제하지 않고 이름이 지정된 폴더에 있는 모든 파일 pdf
만 삭제하고 싶습니다 .pdf
rules/
사용해야 할 것 같아요
cd source
find / -type d -name "rules" -print0 | xargs -0 <<<rm *.pdf?? now what?>>>
하지만 이름이 지정된 모든 하위 폴더 목록을 가져온 후 무엇을 해야 할지 모르겠습니다.rules/
도움을 주시면 감사하겠습니다.
리눅스 민트에서.
답변1
나는 find
다른 것 안에서 하나를 할 것이다 find
. 예를 들어 다음 명령줄을 실행하여 삭제할 파일을 나열합니다.
$ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print ';'
그런 다음 목록을 확인한 후 다음을 수행합니다.
$ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print -delete ';'
답변2
확장된 glob과 null glob을 지원하는 셸을 사용하세요 zsh
. 예를 들면 다음과 같습니다.
for d in ./**/rules/
do
set -- ${d}*.pdf(N)
(( $# > 0 )) && printf %s\\n $@
done
또는 bash
:
shopt -s globstar
shopt -s nullglob
for d in ./**/rules/
do
set -- "${d}"*.pdf
(( $# > 0 )) && printf %s\\n "$@"
done
결과가 만족스러우면 printf %s\\n
로 바꾸십시오.rm
GNU/Linux를 사용하고 있으므로 다음을 실행할 수도 있습니다.
find . -type f -regextype posix-basic -regex '.*/rules/[^/]*.pdf' -delete
-delete
시험 실행을 원하시면 삭제하세요.
답변3
가장 간단한 것은
find source -name '*.pdf' -path '*/rules/*.pdf' -exec rm '{}' +
왜 첫 번째입니까 -name
? 왜냐하면 그것이 더 빠를 것이기 때문입니다. +
여러 매개변수로 ;
하나를 실행하는 대신 rm
하나의 매개변수로 여러 개를 실행하세요. 따라서 더 적은 수의 프로세스가 생성됩니다. Bash에서는 인용하지 않고 탈출할 수 있습니다 {}
.
답변4
bash 스크립트를 사용하여 이 작업을 수행할 수 있습니다(최선의 방법은 아님).
#!/bin/bash
# Don't screw us up with spaces!
IFS=$'\n'; set -f
DIRS=$(find . -type d -name "rules")
for i in $DIRS; do
set +f
rm $i/*.pdf
done
set +f
그러면 명령에서 찾은 디렉터리를 반복 find
하고 각 디렉터리 아래의 pdf 파일을 삭제합니다.
이 줄은 IFS=$'\n'
파일 이름의 공백을 처리하고 set -f
와일드카드를 처리하기 위한 것입니다. 물론 이는 파일 이름에 개행 문자가 없다고 가정합니다. 이렇게 하면 솔루션이 더욱 복잡해집니다.