큰 트리의 특정 이름의 폴더에서 특정 확장자를 가진 모든 파일을 삭제하는 방법은 무엇입니까?

큰 트리의 특정 이름의 폴더에서 특정 확장자를 가진 모든 파일을 삭제하는 방법은 무엇입니까?

pdf나는 그 안에 많은 파일이 들어있는 큰 나무를 가지고 있습니다 . 이 트리에서 파일을 삭제하고 싶지만 내부에 다른 유형의 파일도 있는 하위 폴더 pdf에서만 삭제하고 싶습니다 . 이 하위 폴더에는 다른 하위 폴더가 없습니다.pdfrules/rules/rules/

예를 들어, 저는 이런 나무를 가지고 있습니다. "소스" 아래의 모든 내용

  source/
         A/
            rules/*.pdf, *.txt, *.c,etc..
            etc/
         B/
            keep_this.pdf                
            rules/*.pdf
            whatever/
         C/ 
            D/
               rules/*.pdf
               something/

등. 어디에나 파일이 있지만 다른 곳은 삭제하지 않고 이름이 지정된 폴더에 있는 모든 파일 pdf만 삭제하고 싶습니다 .pdfrules/

사용해야 할 것 같아요

  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와일드카드를 처리하기 위한 것입니다. 물론 이는 파일 이름에 개행 문자가 없다고 가정합니다. 이렇게 하면 솔루션이 더욱 복잡해집니다.

관련 정보