다음 방법을 사용하여 폴더가 비어 있는지 확인합니다.
[[ "$(ls -A /var/folder)" ]] && echo "not empty"
에서 /var/folder
우리는 다음을 수행했습니다.
ls -l /var/folder
total 0
실제로 우리는 어떤 결과도 얻지 못합니다.
하지만 쉘을 실행하면
[[ "$(ls -A /var/folder)" ]] && echo "not empty"
그런 다음 인쇄됩니다.
not empty
그래서 우리는 폴더에 다음과 같은 점이 있는 파일을 포함하고 있음을 발견했습니다.
ls -la /var/folder
total 4
drwxr-xr-x 2 kafka kafka 47 Jan 19 17:23 .
drwxr-xr-x 42 kafka kafka 4096 Jan 19 10:25 ..
-rw-r--r-- 1 kafka kafka 0 Jan 19 17:22 .kafka_cleanshutdown
-rw-r--r-- 1 kafka kafka 0 Jan 19 15:16 .lock
따라서 문제는 폴더가 비어 있는지 확인하면서 "."로 시작하는 파일의 존재를 무시하는 방법입니다.
답변1
도트 파일을 보고 싶지 않다면 무시하세요 -A
!
[[ "$(ls /var/folder)" ]] && echo "not empty"
그러나 를 사용할 필요조차 없습니다 ls
. 셸에서 완전히 수행할 수 있습니다.
file_list=(/var/folder/*)
[[ "${file_list[*]}" != "/var/folder/*" ]] && echo "not empty"
이는 /var/folder/*
와일드카드 패턴("glob")을 확장합니다. 숨겨지지 않은 파일이 있는 경우 file_list
해당 파일의 이름 목록이 됩니다. 그렇지 않다면 그것은 file_list
단지 리터럴 문자열일 뿐입니다 /var/folder/*
.
여기에는 버그가 있습니다. 디렉터리에 리터럴 string 이 될 literal *
이라는 파일이 포함되어 있으면 위 코드는 실패합니다(디렉토리가 비어 있음을 나타냄). 다음을 수행하여 이 문제를 해결할 수 있습니다.${file_list[*]}
/var/folder/*
shopt -s nullglob
file_list=(/var/folder/*)
[[ "${file_list[*]}" != "" ]] && echo "not empty"
shopt -u nullglob
물론 강력한 스크립트는 설정을 처음에 확인한 nullglob
다음 그냥 취소하는 대신 마지막에 복원합니다.
이것은 bash용으로 작성되었으며 모든 쉘에서 작동하지는 않습니다.
답변2
*
디렉토리를 확장하고 일치하는 이름의 수를 셀 수 있습니다 . 이름이 0개와 일치하면 디렉터리는 비어 있습니다. 기본적으로 이 *
패턴은 숨겨진 이름("선두 점이 있는 파일")과 일치하지 않습니다.
shopt -s nullglob
set -- /var/folder/*
if [ "$#" -eq 0 ]; then
echo '/var/folder is empty'
fi
"$#"
set
관련 디렉토리에 표시되는 이름 으로 설정한 위치 인수 목록의 요소 수입니다 .
원하는 경우 bash
배열을 사용할 수 있습니다.
shopt -s nullglob
names=( /var/folder/* )
if [ "${#names[@]}" -eq 0 ]; then
echo '/var/folder is empty'
fi
unset -v names
nullglob
패턴이 아무것도 일치하지 않으면 완전히 제거되도록 위의 스니펫에서 설정했습니다 . 를 사용하지 않는 보다 이식성이 뛰어난 변형은 nullglob
첫 번째 변형처럼 사용한 set
다음 $1
존재 여부를 테스트하는 것입니다.
set -- /var/folder/*
if [ ! -e "$1" ] && [ ! -h "$1" ]; then
echo '/var/folder is empty'
fi
-h
이름이 심볼릭 링크인지 테스트해야 합니다 $1
. 그렇지 않으면 깨진 심볼릭 링크를 감지할 수 없습니다.