폴더가 비어 있는지 확인하고 if-then-else-문에서 해당 콘텐츠를 사용하는 방법은 무엇입니까?

폴더가 비어 있는지 확인하고 if-then-else-문에서 해당 콘텐츠를 사용하는 방법은 무엇입니까?

폴더가 비어 있는지 확인해야 하며 출력에 따라 다른 명령을 실행해야 합니다. 저는 Ubuntu 18.04.5 LTS에서 작업하고 있습니다.

내 bash 스크립트:

if [ "$(ls -A /mnt/mamdrive/"As Metadata"/)" ] || ["$(ls -A /mnt/mamdrive/"As Video"/)"  ]; then
    echo "copy file"
else
    echo "dont copy"
fi

조건이 작동하는 경우도 있지만 작동하지 않는 경우도 있어 재현이 어렵습니다. 디렉토리가 비어 있는지 확인하고 그에 따라 조치를 취하는 다른 방법이 있습니까?

답변1

문자열 출력에 의존하지 않는 것을 제안하고 싶습니다 ls. 예를 들어 glob 확장 결과가 있는지 테스트하는 것입니다.

#!/bin/bash

shopt -s nullglob       # don't return literal glob if matching fails
shopt -s dotglob        # make * match "almost all" like ls -A

set -- /mnt/mamdrive/"As Metadata"/*

if (( $# > 0 )); then
  echo "not empty"
else
  echo "empty"
fi

두 디렉터리가 모두 비어 있는지 테스트하려면 두 디렉터리를 모두 glob하면 됩니다.

set -- /mnt/mamdrive/"As Metadata"/* /mnt/mamdrive/"As Video"/*

답변2

가장 쉬운 방법은 다음과 같은 문 ls -A에서 사용하는 것입니다 if.

path=$(ls -A '/whatever/sub directory/more spaces')
if [[ ! -z "$path" ]]; then
    echo "Directory is NOT empty!"
else
    echo "Directory is empty!"
fi

답변3

find와 함께 ifne빈 복사본으로 작업할 수 있습니다.

$ find test/ -maxdepth 0 -empty | ifne cp -t test/ a

if 문에서 이를 사용하면 다음과 같이 보일 수 있습니다.

#!/bin/bash

if find test/ -maxdepth 0 ! -empty | ifne false; then
   echo Directory is empty
else
   echo Directory is not empty
fi

답변4

ls구문 분석은 처음부터 구문 분석이 가능하도록 의도되지 않았기 때문에 오류가 발생하기 쉬운 것으로 잘 알려져 있으므로 다른 솔루션이 선호되어야 합니다. @steeldriver의 답변 외에도 다음을 사용하여 이 작업을 수행할 수도 있습니다 find.

if [[ "$(find '/mnt/mamdrive/As Metadata' '/mnt/mamdrive/As Video' -maxdepth 1 -mindepth 1 2>/dev/null)" ]]
then
    echo “copy file”
else
    echo "don't copy"
fi

maxdepth여기서 옵션 은 mindepth지정된 디렉토리의 직계 하위 항목만 인쇄하고 스캔하는 데 사용됩니다. 리디렉션은 일부 인수가 존재하지 않는 경우 오류 메시지가 인쇄되지 않도록 합니다.

여러 디렉터리를 추가하면 OR로 작동하므로 테스트된 디렉터리 중 하나 이상이 비어 ​​있지 않으면 "파일 복사"가 인쇄됩니다. 을 사용하면 find파일 이름, 파일 유형 등과 같은 인수를 사용하여 더 세부적으로 조정할 수도 있습니다.

관련 정보