bash + 폴더가 비어 있는지 테스트하지만 앞에 점이 있는 파일은 제외합니다.

bash + 폴더가 비어 있는지 테스트하지만 앞에 점이 있는 파일은 제외합니다.

다음 방법을 사용하여 폴더가 비어 있는지 확인합니다.

[[ "$(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. 그렇지 않으면 깨진 심볼릭 링크를 감지할 수 없습니다.

관련 정보