일련의 하위 폴더(예: 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 \;
제 생각에는 이와 같은 명령(잠재적으로 심각한 결과를 초래할 수 있는 명령)을 처리하는 가장 좋은 방법은 실행하려는 명령 앞에 "에코" 문을 추가하는 것입니다. 방아쇠를 당기기 전에 원했던 것 같습니다.