각 하위 디렉터리의 파일을 반복하고 조건을 적용합니다.

각 하위 디렉터리의 파일을 반복하고 조건을 적용합니다.

내 디렉토리에는 여러 개의 파일이 포함된 많은 하위 디렉토리가 포함되어 있습니다(확장자가 .ar인 파일만 관심 있음). 이제 각 하위 디렉터리를 반복하여 확인해야 합니다. 예를 들어 파일 수가 4이면 해당 파일로 작업을 수행하고 두 번째 하위 디렉터리로 돌아가서 파일을 확인한 다음 = 3이면 해당 파일로 다른 명령을 수행합니다. . if 문에 매우 복잡한 조건을 적용해야 한다는 점에 유의하세요.

이것과 비슷한 것

dir=$1

for sub_dir in $dir; do
    if the number of files in $sub_dir = 4; then
        do something or command line 
    if the number of files in $sub_dir = 3; then
       do another command
    if the number of files in $sub_dir < 3; then
    escape them

    fi
done

비슷한 프로세스를 위한 템플릿이 필요합니다.

답변1

하위 디렉터리가 최상위 디렉터리 바로 아래에 있다고 가정합니다.

#!/bin/sh

topdir="$1"

for dir in "$topdir"/*/; do
    set -- "$dir"/*.ar

    if [ "$#" -eq 1 ] && [ ! -f "$1" ]; then
        # do things when no files were found
        # "$1" will be the pattern "$dir"/*.ar with * unexpanded
    elif [ "$#" -lt 3 ]; then
        # do things when less than 3 files were found
        # the filenames are in "$@"        
    elif [ "$#" -eq 3 ]; then
        # do things when 3 files were found
    elif [ "$#" -eq 4 ]; then
        # do things when 4 files were found
    else
        # do things when more than 4 files were found
    fi
done

또는 다음을 사용하십시오 case.

#!/bin/sh

topdir="$1"

for dir in "$topdir"/*/; do
    set -- "$dir"/*.ar

    if [ "$#" -eq 1 ] && [ ! -f "$1" ]; then
        # no files found
    fi

    case "$#" in
        [12])
            # less than 3 files found
            ;;
        3)
            # 3 files found
            ;;
        4)
            # 4 files found
            ;;
        *)
            # more than 4 files found
    esac
done

파일 이름이 필요한 코드 분기는 "$@"하위 디렉터리의 모든 파일 이름을 참조하는 데 사용되거나 개별 파일을 참조하는 데 사용 "$1"됩니다 . 파일 이름은 시작 디렉터리를 포함한 경로 이름 "$2"입니다 .$topdir

답변2

다음을 수행할 수 있습니다.

dir=$1

subdirectories = $(find $dir -type d) # find only subdirectories in dir

for subdir in $subdirectories
do
   n_files=$(find $subdir -maxdepth 1 -type f | wc -l) # find ordinary files in subdir and get it quantity

   if [ $n_files -eq 4 ]
   then
      do_something_4
   fi

   if [ $n_files -eq 3 ]
   then
      do_something_3
   fi

   if [ $n_files -lt 3 ]
   then
      do_something_else
   fi
done 

관련 정보