*-nom1
이름에 특정 문자열이 포함되거나 끝나는 하위 디렉터리(예: , *-nom2
, ) 에서 특정 명령을 실행하는 스크립트를 작성하고 싶습니다 *-nom3
. 즉
for dir in $(subs)
do
// do something in this dir
done
내 질문은 이것이 내 하위 디렉터리를 나열하는 방법인지, 그렇지 않은 경우 가장 좋은 방법은 무엇인지입니다.
subs = find -maxdepth 2 -type d -name '*-nom1'
&& find -maxdepth 2 -type d -name '*-nom2'
&& find -maxdepth 2 -type d -name '*-nom3'
내 터미널에서 테스트해 볼 수 있는데 Ubuntu
제대로 작동하는 것 같습니다.
도움이 된다면 내 스크립트는 계속 실행됩니다 Debian
.
답변1
내가 생각할 수 있는 두 가지
3개의
find
통화를 하나로 결합find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
외부 루프를
find
방지하기 위해 명령 실행 기능 활용for
find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \) \ -exec sh -c 'for d; do cd "$d"; cmd1; cmd2; cmd3; ...; done' sh {} +
답변2
테스트를 "or" 표현 find
과 결합할 수 있습니다 . 테스트 사이의 암시적 연산자는 "and"입니다. -o
예를 들어:
subs="$(find -maxdepth 2 -type d \( \
-name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) )"
for d in $subs ; do
... do something with "$d" ...
done
`-name " 주위의 괄호-nom1 "-o -이름"-nom2" -o "*-nom3"은 셸 예약어이므로 따옴표가 필요합니다.
이제 don_crissti가 의견에서 말했듯이 일반적인 조언은 두 가지 이유로 출력 캡처를 피하는 것입니다 . find
첫째, 파일 이름에 공백, 개행, 특수 문자 등이 포함될 수 있기 때문입니다. find
결과. 더 나은 관용구는 암시적 루프를 사용하는 것 find
입니다. 바라보다찾기 결과를 반복하는 것이 나쁜 습관인 이유및 관련 토론:
find -maxdepth 2 -type d \( \
-name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) -exec \
... do something with '{}' ...
\;