관련 뭐든지 ls
특수 문자 (공간과 다른 기호)와 예기치 않은 결과가 발생할 가능성이 높습니다. 배열과 같은 모든 bashism은 이식성이 없습니다. while read
일반적으로 관련된 것은 느립니다.
다른 한편으로, find
매우 유연하고 (여러 가지 옵션으로 필터링 할 수 있음), 특수 문자에는 실패 할 수있는 적어도 두 가지 구문이 있습니다. 큰 디렉토리에서 잘 확장됩니다.
이 예제에서는 -iname
대문자와 소문자 확장명을 모두 사용 했습니다. 또한 -maxdepth 1
귀하의 질문의 "현재 디렉토리"를 존중하도록 제한했습니다 . 파일 이름에 CR / LF가 포함될 수있는 줄 수를 계산하는 대신 -print0
각 파일 이름 끝에 NULL 바이트를 인쇄합니다. 따라서 | tr -d -c "\000" | wc -l
파일을 정확하게 계산하는 것입니다 (NULL 바이트!).
extensions="jpg png gif"
for ext in $extensions; do
c=$(find . -maxdepth 1 -iname "*.$ext" -print0 | tr -d -c "\000" | wc -c)
if [ $c -gt 0 ]; then
echo "Found $c *.$ext files"
find . -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -r -n1 DOSOMETHINGHERE
# or # find . -maxdepth 1 -iname "*.$ext" -exec "ls" "-l" "{}" ";"
fi
done
PS -print0 | tr -d -c "\000" | wc -c
는 -printf "\000" | wc -c
또는 로 교체 할 수 있습니다 -printf '\n' | wc -l
.