현재 디렉토리 목록에서 특별히 형식화된 배열을 추출하고 싶습니다.
$ 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)
을 추가합니다 .)hello
world
#!/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' )
zsh
csh/tcsh에서와 마찬가지로 에서는 ( 명령을 검색할 디렉터리 목록을 지정하는 표준 환경 변수) $path
에 바인딩된 특수 배열 이며 일반 변수로 사용할 수 없으므로 위에서 사용합니다.$PATH
$dir