모든 하위 폴더에서 명령 실행

모든 하위 폴더에서 명령 실행

일련의 하위 폴더(예: from a~ )가 있고 z각 하위 폴더에 대해 명령(예: rm *.pdf또는 )을 실행하려는 경우 어떻게 합니까 ls *.pdf? "수동" 방법은 cd a, rm *.pdf, , ls *.pdf, cd .., cd b... 이것은 너무 복잡해 보이기 때문에 더 쉬운 방법이 있을 것이라고 확신합니다.

답변1

이것을 시도하십시오 (사용,버팀대 확장그리고 공):

rm -f {a..z}/*.pdf

또는

rm -f [a-z]/*.pdf

쉘이 누락된 경우버팀대 확장특징.

그와 반대로 [a-z]( {a..z}ksh93에서도 지원됨) 그렇지 않고 중괄호 확장이며 glob파일이 존재하는지 여부를 (이전) 확장합니다. a, b...가 존재하는지 존재하지 않는지에 관계없이 ... globs처럼요 . rm -f a/*.pdf b/*.pdf또한 이는 범위가 로케일에 따라 달라질 수 있는 경우(예: ...를 [a-z]포함할 수 있음)와는 달리 바이트 범위에서만 작동합니다( 알파벳 및 숫자 범위 에 대해서만 안정적으로 작동함 ).é, ś{a..z}ASCII

(설명해주신 Stephen Chazeras에게 감사드립니다)

답변2

이 특정 예의 경우:

rm [a-z]/*.pdf

어떤 껍질에서든.

일반적인 경우 Bourne과 같은 쉘을 사용하여 디렉토리 목록을 $1, $2...에 넣습니다.

set a b c foo bar...

그런 다음 다음과 같이 반복하십시오.

for i do (cd -- "$i" && cmd -- *.pdf); done

물론 하나의 명령으로 두 가지를 모두 수행할 수 있습니다.

for i in a b c foo bar...; do (cd -- "$i" && cmd -- *.pdf); done

요점은 해당 하위 컨텍스트만 영향을 받도록 하위 쉘을 사용하는 (...)것 입니다 cd.

답변3

find가 아마도 가장 좋은 솔루션일 수 있지만 쉘(bash)에서 구현하기 쉽습니다.

GLOBIGNORE=.
for subdir in *; do
  test -d "$subdir" || continue
  cd "$subdir"
  ls *pdf
  cd -
done

훨씬 더 쉽게

ls */*.pdf

답변4

사용찾다. 다음과 같은 명령은 모든 폴더(두 개 이하의 폴더 깊이)를 찾은 다음 rm <pathname>/*.pdf해당 폴더에서 실행합니다.

find pathwithsubfolders -type d -maxdepth 1 -mindepth 1 -exec rm {}/\*.pdf \;

제 생각에는 이와 같은 명령(잠재적으로 심각한 결과를 초래할 수 있는 명령)을 처리하는 가장 좋은 방법은 실행하려는 명령 앞에 "에코" 문을 추가하는 것입니다. 방아쇠를 당기기 전에 원했던 것 같습니다.

관련 정보