현재 디렉터리 항목 목록의 특수 배열

현재 디렉터리 항목 목록의 특수 배열

현재 디렉토리 목록에서 특별히 형식화된 배열을 추출하고 싶습니다.

$ ls
Output:
fileABC.ext1
filePQR.ext2
dirMNO
dirFGH

특정 확장자를 가진 디렉터리와 파일만 원합니다

나는 이런 배열을 원한다 (1 dirFGH "is a dir" 2 dirMNO "is a dir" 3 fileABC.ext1 "is an ext1 file")

나도 같은 일을 하고 있어요

num=0
while read -r line
do
    if [ -d $line ]
    then
        num=$(( $num + 1 ))
        array+=(num)
        array+=($line)
        array+=("Is a dir")
    elif #check for extension used
    then
        num=$(( $num + 1 ))
        array+=(num)
        array+=($line)
        array+=("Is an ext1 file")
    fi
done < <(ls -1 --group-directories-first "$path")

하지만 이 방법은 속도가 더 느립니다. 기능적으로 동일하지만 최적화된 방법을 제안해주세요.

답변1

구문 분석할 필요가 없습니다 ls. 변수(예:)를 사용할 때마다 큰따옴표를 사용해야 합니다 . 그렇지 않으면 분할 (보통 공백) 및 와일드카드 "$line"의 영향을 받습니다 . $IFS(예를 들어, $line그렇다면 hello world두 개의 값 과 array+=($line)을 추가합니다 .)helloworld

#!/bin/bash
array=()

for item in *
do
    if [[ -d "$item" ]]
    then
        # Directory
        array+=( $((${#array[@]} /3 +1)) "$item" 'is a dir' )

    elif [[ -f "$item" ]] && [[ "$item" = *.ext1 ]]
    then
        # Files with an ext1 suffix
        array+=( $((${#array[@]} /3 +1)) "$item" 'is an ext1 file' )
    fi
done

# Dump the array
printf "%2d. '%s' %s\n" "${array[@]}"

산출

1. 'dirFGH' is a dir
2. 'dirMNO' is a dir
3. 'fileABC.ext1' is an ext1 file

이 표현식은 $((${#array[@]} /3 +1))이미 배열에 있는 삼중 값의 수를 기반으로 항목 수를 계산하므로 캐리가 필요하지 않습니다 $num.

가능한 개선

특정 유형의 파일을 찾고 있는 경우 를 사용하여 확인할 수 있습니다 file. 예를 들어 file x.ods내 컴퓨터로 돌아갑니다 x.ods: OpenDocument Spreadsheet.

두 개의 서로 다른 배열(파일 이름용 배열과 사용자 정의 파일 형식 메시지용 배열)을 사용하는 것이 더 쉬울 수도 있습니다.

filenames+=("$item")
filetypes+=('Is a dir')

여기서 인덱스 값( $num)은 자체 배열에 저장하지 않고 항목의 인덱스에서 직접 파생될 수 있습니다.

답변2

zsh대신 사용하십시오 bash:

array=() n=0
for f ( $dir/*(N-/) ) array+=( $((++n)) $f:t 'is a dir' )
for f ( $dir/*.ext1(N^-/) ) array+=( $((++n)) $f:t 'is a ext1 non-directory file' )

zshcsh/tcsh에서와 마찬가지로 에서는 ( 명령을 검색할 디렉터리 목록을 지정하는 표준 환경 변수) $path에 바인딩된 특수 배열 이며 일반 변수로 사용할 수 없으므로 위에서 사용합니다.$PATH$dir

관련 정보