답변:
if [ -z "$(ls -A /path/to/dir)" ]; then
echo "Empty"
else
echo "Not Empty"
fi
또한 디렉토리가 이전에 존재하는지 확인하는 것이 좋습니다.
&&
과 ||
동시에! 경우 echo "Not Empty"
에 실패, echo "Empty"
실행됩니다! 시도하십시오 echo "test" && false || echo "fail"
! 그렇습니다. 나는 echo
실패하지 않을 것입니다. 그러나 다른 명령을 바꾸면 놀라운 일이 될 것입니다!
[ "$(ls -A /)" ] && touch /non-empty || echo "Empty"
-파일 이름이 비어있는 비어 있지 않은 디렉토리를 "표시"하려는 경우 non-empty
실패하고 "빈"이 인쇄됩니다.
touch /empty
내 라인 어 where 어 ?
if [ -n "$(ls -A /path/to/dir)" ]; then
사람이 어딘가에 자신의 서버에이 코드를 붙여 넣 및 해커가이를 악용하는 방법을 파악하기 전에 ... 답을 업데이트하시기 바랍니다. 경우 /path/to/dir
비어 있지 않은, 다음 파일 이름이 인수로 전달받을은 할 수 /bin/test
있는 분명 아니다. -n
문제가 해결 된 논쟁을 추가하십시오 . 감사!
껍데기를 구할 필요가 없습니다. read
와 함께 사용할 수도 있습니다 find
. 경우 find
의 출력이 비어있는, 당신은 돌아갑니다 false
:
if find /some/dir -mindepth 1 | read; then
echo "dir not empty"
else
echo "dir empty"
fi
휴대용이어야합니다.
echo
전화가 잘못된 결과를 반영 한다고 생각합니다 . (Cygwin에서) 내 테스트 find . -mindepth 1 | read
에서 비어 있지 않은 디렉토리에 141 오류 코드가 있었고 빈 디렉토리에 0이있었습니다
read
0을 반환하고 비어있는 디렉토리의 경우 1을 반환합니다.
set -o pipefail
if [ -n "$(find "$DIR_TO_CHECK" -maxdepth 0 -type d -empty 2>/dev/null)" ]; then
echo "Empty directory"
else
echo "Not empty or NOT a directory"
fi
-n
가 정확하고 안전 해야합니다 ( 이름에 공백이있는 디렉토리로 테스트하고 이름이 '0 = 1'인 비어 있지 않은 디렉토리로 테스트). ... [ -n "$(find "$DIR_TO_CHECK" -maxdepth 0 -type d -empty 2>/dev/null)" ]; ...
grep
. serverfault.com/questions/225798/…
find "$DIR_TO_CHECK" -maxdepth 0 -type d -empty | grep .
grep의 종료 상태에 의존 할 수 있습니다 . 어떤 방법을 사용하든 이것은이 질문에 대한 정답입니다.
#!/bin/bash
if [ -d /path/to/dir ]; then
# the directory exists
[ "$(ls -A /path/to/dir)" ] && echo "Not Empty" || echo "Empty"
else
# You could check here if /path/to/dir is a file with [ -f /path/to/dir]
fi
현재 작업 디렉토리 (.)에서 작업을 수행합니다.
[ `ls -1A . | wc -l` -eq 0 ] && echo "Current dir is empty." || echo "Current dir has files (or hidden files) in it."
또는 같은 명령이 더 읽기 쉽도록 세 줄로 나뉩니다.
[ `ls -1A . | wc -l` -eq 0 ] && \
echo "Current dir is empty." || \
echo "Current dir has files (or hidden files) in it."
그냥 교체 ls -1A . | wc -l
와 ls -1A <target-directory> | wc -l
다른 대상 폴더에서 실행해야하는 경우.
편집 : 나는 교체 -1a
와 함께 -1A
(@Daniel 설명을 참조)
ls -A
대신. 일부 파일 시스템이없는 .
및 ..
워드 프로세서에 따라 기호 링크.
-1
확실히 중복됩니다. 하더라도 ls
그것이 파이프 될 때 한 줄에 하나의 항목을 인쇄되지 않습니다 다음은 0 개 이상의 라인을 생산하는 경우 검사의 아이디어에 영향을주지 않습니다.
다음을 사용하십시오.
count="$( find /path -mindepth 1 -maxdepth 1 | wc -l )"
if [ $count -eq 0 ] ; then
echo "No new file"
exit 1
fi
이 방법으로의 출력 형식과 독립적입니다 ls
. -mindepth
디렉토리 자체를 건너 뛰고 -maxdepth
하위 디렉토리를 재귀 적으로 방어하여 속도를 높입니다.
wc -l
하고 있습니다 find
(합리적으로 평범합니다).
배열 사용하기 :
files=( * .* )
if (( ${#files[@]} == 2 )); then
# contents of files array is (. ..)
echo dir is empty
fi
shopt -s nullglob
${#files[@]} == 2
가정은 루트 디렉토리에 대한 서 있지 않는 (가 비어 있지만, 경우에 당신은 아마 테스트 할 것이다 제한 수도에 대해 알고하지 않습니다 일부 코드).
해킹이지만 배쉬 전용, PID가없는 방법 :
is_empty() {
test -e "$1/"* 2>/dev/null
case $? in
1) return 0 ;;
*) return 1 ;;
esac
}
이것은 test
다음에 하나 이상의 인수가 주어진 경우 내장 종료가 2로 종료 된다는 사실을 이용합니다 -e
. 첫째, "$1"/*
glob는 bash에 의해 확장됩니다. 결과적으로 파일 당 하나의 인수가 발생합니다. 그래서
파일이 없으면 별표 test -e "$1"*
가 확장되지 않으므로 셸은이라는 파일을 시도하여 *
1을 반환합니다.
... 실제로 정확히 하나의 파일이있는 경우를 제외하고 *
별표는 별표로 확장됩니다. test -e "dir/*"
, 이번에는 0을 반환합니다. (이 점을 지적 해 주셔서 감사합니다.)
파일이 하나 있으면 test -e "dir/file"
실행되어 0을 반환합니다.
그러나 1보다 많은 파일이 있으면 test -e "dir/file1" "dir/file2"
bash가 사용 오류로보고합니다 (예 : 2).
case
1 개의 종료 상태가있는 첫 번째 경우 만 성공으로보고되도록 전체 논리를 둘러 쌉니다.
내가 확인하지 않은 가능한 문제 :
허용되는 인수 수보다 많은 파일이 있습니다 .2+ 파일의 경우와 비슷하게 작동 할 수 있습니다.
또는 실제로 이름이 비어있는 파일이 있습니다. 정상적인 OS / FS에서도 가능하지 않습니다.
test -e dir/*
호출됩니다. dir에서 유일한 파일이 '*'이면 test는 0을 반환합니다. 더 많은 파일이 있으면 2를 반환합니다. 따라서 설명 된대로 작동합니다.
FIND (1) (Linux 및 FreeBSD에서)를 사용하면 "-maxdepth 0"을 통해 디렉토리 항목을 비재 귀적으로보고 "-empty"로 비어 있는지 테스트 할 수 있습니다. 이 질문에 적용됩니다 :
if test -n "$(find ./ -maxdepth 0 -empty)" ; then
echo "No new file"
exit 1
fi
가장 좋은 해결책은 다음과 같습니다.
files=$(shopt -s nullglob; shopt -s dotglob; echo /MYPATH/*)
[[ "$files" ]] || echo "dir empty"
https : //.com/a/91558/520567 덕분에
이것은 누군가에게 도움이되거나 도움이되지 않는 익명의 내 답변 편집입니다.
files=$(shopt -s nullglob dotglob; s=(MYPATH/*); echo ${s[*]})
echo "MYPATH contains $files files"
파일 이름에 공백이 있어도 올바르게 작동합니다.
if find "${DIR}" -prune ! -empty -exit 1; then
echo Empty
else
echo Not Empty
fi
편집 :이 솔루션은 구현을 간략하게 살펴본 후 gnu find와 함께 잘 작동한다고 생각합니다 . 그러나 이것은 netbsd의 find 와 같이 작동하지 않을 수 있습니다. 실제로, 그것은 stat (2)의 st_size 필드를 사용합니다. 매뉴얼에서는 다음과 같이 설명합니다.
st_size The size of the file in bytes. The meaning of the size
reported for a directory is file system dependent.
Some file systems (e.g. FFS) return the total size used
for the directory metadata, possibly including free
slots; others (notably ZFS) return the number of
entries in the directory. Some may also return other
things or always report zero.
더 간단한 해결책은 다음과 같습니다.
if find "${DIR}" -mindepth 1 -exit 1; then
echo Empty
else
echo Not Empty
fi
또한 첫 번째 솔루션의 -prune은 쓸모가 없습니다.
편집 : gnu 찾기에 대한 -exit 없음. 위의 솔루션은 NetBSD의 찾기에 좋습니다. GNU find의 경우 다음과 같이 작동합니다.
if [ -z "`find \"${DIR}\" -mindepth 1 -exec echo notempty \; -quit`" ]; then
echo Empty
else
echo Not Empty
fi
-exit
술어 가 없습니다 .
이것은 모두 훌륭한 것입니다-방금 스크립트로 만들었으므로 현재 디렉토리 아래의 빈 디렉토리를 확인할 수 있습니다. 아래는 'findempty'라는 파일에 넣고 bash가 파일을 찾은 다음 chmod 755를 실행할 수 있도록 경로에 배치해야합니다. 내가 생각하는 특정 요구 사항에 맞게 쉽게 수정할 수 있습니다.
#!/bin/bash
if [ "$#" == "0" ]; then
find . -maxdepth 1 -type d -exec findempty "{}" \;
exit
fi
COUNT=`ls -1A "$*" | wc -l`
if [ "$COUNT" == "0" ]; then
echo "$* : $COUNT"
fi
../IN
스크립트가 디렉토리 에 있다고 생각하면 directory 에서 파일을 확인하고 처리하는 것이 나를 위해 작동합니다 ../Script
.
FileTotalCount=0
for file in ../IN/*; do
FileTotalCount=`expr $FileTotalCount + 1`
done
if test "$file" = "../IN/*"
then
echo "EXITING: NO files available for processing in ../IN directory. "
exit
else
echo "Starting Process: Found ""$FileTotalCount"" files in ../IN directory for processing."
# Rest of the Code
현재 하나 이외의 디렉토리를 들어, 당신은에 시도하여 비어 있는지 확인 할 수 rmdir
있기 때문에, 그것은 rmdir
비어 있지 않은 디렉토리에 실패 보장된다. 경우 rmdir
성공, 당신은 실제로 단지, 빈 디렉토리가 테스트를 생존하고 싶었 mkdir
그것을 다시.
잠깐 동안 존재하지 않는 디렉토리에 의해 혼란스러워 질 수있는 다른 프로세스가있는 경우이 핵을 사용하지 마십시오.
경우 rmdir
당신을 위해 작동하지 않습니다, 당신은 잠재적으로 많은 수의 파일, 느린 얻을 및 / 또는 명령 줄 길이 제한으로 실행할 수 쉘 대체 (globbing)에 의존하는 모든 솔루션을 포함 할 수 디렉토리를 테스트 할 수 있습니다. find
이 경우 에 사용 하는 것이 좋습니다 . find
내가 생각할 수있는 가장 빠른 솔루션은 다음과 같습니다.
is_empty() {
test -z $(find "$1" -mindepth 1 -printf X -quit)
}
이것은 GNU 및 BSD 버전에서는 작동 find
하지만 Solaris 버전에서는 작동 하지 않습니다 find
. 당신의 일을 사랑하십시오, 오라클.
디렉토리를 제거하고 오류를 기다릴 수 있습니다. rmdir 은 디렉토리가 비어 있지 않으면 삭제하지 않습니다.
_path="some/path"
if rmdir $_path >/dev/null 2>&1; then
mkdir $_path # create it again
echo "Empty"
else
echo "Not empty or doesn't exist"
fi
rmdir
디렉토리를 제거 할 권한이 없으면 실패합니다. 또는 Btrfs 하위 볼륨 인 경우 또는 읽기 전용 파일 시스템에 속하는 경우 그리고 경우는 rmdir
실패하지 않고 mkdir
실행을 : 이미 제거 디렉토리가 다른 사용자에게 속한 어떤 경우? 표준이 아닌 권한은 어떻습니까? ACL? 확장 된 속성? 모두졌다.