하위 디렉터리를 볼 때 디렉터리 건너뛰기

하위 디렉터리를 볼 때 디렉터리 건너뛰기

다음 하위 폴더가 있는 디렉터리가 있습니다 /u01/oracle/folders.

[root@ricusesasctl01vm tax_receipts]# ls -ltr
total 64
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 Argentina
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 Brazil
drwxr-xr-x 3 OICDev1 oic 4096 Mar  1  2021 completed
drwxr-xr-x 3 OICDev1 oic 4096 Mar  1  2021 duplicate
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 EAO
drwxr-xr-x 3 OICDev1 oic 4096 Mar  1  2021 errored
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 Japan
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 Korea
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 SAO
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 SPPO
drwxr-xr-x 3 OICDev1 oic 4096 Mar  1  2021 temp
drwxr-xr-x 4 OICDev1 oic 4096 Mar  1  2021 template
drwxr-xr-x 3 OICDev1 oic 4096 Mar  1  2021 template2
drwxr-xr-x 5 OICDev1 oic 4096 Mar  1  2021 WHQ
drwxr-xr-x 5 OICDev1 oic 4096 May 10  2021 Canada
drwxr-xr-x 3 OICDev1 oic 4096 Jun  8  2021 canada

쉘 스크립트에서는

SourceDirectory="/u01/oracle/folders"
TargetDirectory=/u01/oracle/folders"

값의 경우 $SourceDirectorySAO를 제외한 모든 하위 폴더를 나열하고 싶습니다.

루프에서 이 명령을 사용하세요

#100 Loop through each directory (e.g. brazil, canada, uk)
#
for EachDir in "$SourceDirectory"*;
do
 strFiles=""
 echo "Current Directory is $EachDir"

나는 시도했다:

SourceDirectory=$(find /u01/oracle/folders -maxdepth 1 -type d \( ! -name SAO \))

디렉터리 SAO를 건너뛰지만 출력은 긴 목록입니다. 이 문자열을 디렉터리로 어떻게 분할할 수 있나요?

예:

[root@ricusesasctl01vm tax_receipts]# SourceDirectory=$(find /u01/oracle/folders -maxdepth 1 -type d \( ! -name SAO \))
[root@ricusesasctl01vm tax_receipts]# echo $SourceDirectory
/u01/oracle/folders /u01/oracle/folders/duplicate /u01/oracle/folders/Brazil /u01/oracle/folders/completed /u01/oracle/folders/template2 /u01/oracle/folders/Canada /u01/oracle/folders/SPPO /u01/oracle/folders/template /u01/oracle/folders/WHQ /u01/oracle/folders/EAO /u01/oracle/folders/errored /u01/oracle/folders/Korea /u01/oracle/folders/Japan /u01/oracle/folders/Argentina /u01/oracle/folders/temp /u01/oracle/folders/canada

답변1

find /u01/oracle/folders -maxdepth 1 -type d \( ! -name SAO \) | while read SourceDirectory
do
  echo "$SourceDirectory"
  ls "$SourceDirectory"
done

답변2

SAO간단한 쉘 루프에서 이 디렉터리를 쉽게 건너뛸 수 있습니다 .

SourceDirectory=/u01/oracle/folders

for dirpath in "$SourceDirectory"/*/; do
    case $dirpath in
        */SAO/) continue ;;
    esac

    # Process "$dirpath" in whatever way is needed.
done

를 사용하면 다음 으로 bash바꿀 수 있습니다.case ... esac

[[ $dirpath == */SAO/ ]] && continue

두 경우 모두 이 코드는 파일 이름 와일드카드 패턴 테스트를 사용하여 의 문자열이 $dirpath일치 하는지 확인 */SAO/하고 리터럴 string 으로 끝나는지 확인합니다 /SAO/.

또 다른 접근 방식 bash은 루프에서 확장된 글로빙 패턴을 사용하는 것입니다.

shopt -s extglob

SourceDirectory=/u01/oracle/folders

for dirpath in "$SourceDirectory"/!(SAO)/; do
    # Process "$dirpath" in whatever way is needed.
done

루핑에 사용되는 패턴은 $SourceDirectory이름이 지정된 디렉터리를 제외한 모든 디렉터리와 일치합니다 SAO. bash셸에서 확장된 와일드카드 모드를 사용 하려면 해당 모드를 활성화해야 합니다 shopt -s extglob.

find건너뛰고 싶은 디렉토리가 무엇인지 정확히 알고 있기 때문에 여기서는 사용 하지 않겠습니다 .

당신이 당신을 느낀다면정말 필요한이렇게 하려면 find다음을 수행하는 것이 좋습니다.

SourceDirectory=/u01/oracle/folders

find "$SourceDirectory" ! -path "$SourceDirectory" -prune \
    -type d ! -name SOA -exec sh -c '
    for dirpath do
        # Process "$dirpath" in whatever way is needed.
    done' sh {} +

또는 GNU를 사용하십시오 find.

SourceDirectory=/u01/oracle/folders

find "$SourceDirectory" -mindepth 1 -maxdepth 1 \
    -type d ! -name SOA -exec sh -c '
    for dirpath do
        # Process "$dirpath" in whatever way is needed.
    done' sh {} +

find이는 반복할 문자열 생성기 로 사용됩니다 . 이 문자열은 $SourceDirectory이 디렉토리를 제외한 모든 디렉토리의 경로 이름입니다 SOA.

수행하려는 처리는 sh -c명령줄에 제공된 인라인 스크립트를 통해 수행됩니다.

관련 정보