일부 이름 지정 변환을 사용하여 하위 디렉터리 나열

일부 이름 지정 변환을 사용하여 하위 디렉터리 나열

*-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

내가 생각할 수 있는 두 가지

  1. 3개의 find통화를 하나로 결합

    find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
    
  2. 외부 루프를 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 '{}' ...
\;

관련 정보