ksh 디렉토리가 비어 있는지 확인하십시오.

ksh 디렉토리가 비어 있는지 확인하십시오.

AIX에서 ksh의 디렉토리가 비어 있는지 확인하는 방법은 무엇입니까?

파일이 있으면 삭제하면 됩니다.

답변1

dir이는 내장된 쉘 구성만을 사용하여 무효성을 테스트하는 POSIX 호환 방법입니다. 이 set명령은 위치 인수를 도트 파일(항상 존재하는 .sum 포함 ..)로 설정한 다음 도트가 아닌 파일을 설정합니다. 디렉토리가 비어 있으면 .*glob은 .and 에만 일치 ..하고 *glob은 아무것도 일치하지 않으므로 확장되지 않은 상태로 유지됩니다.

set dir/.* dir/*
[ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ]

이는 ATT ksh에서 작동하지만 특정 생략된 쉘 .및 항목에서는 실패합니다. ..이식성을 높이려면 .*아무것도 일치하지 않도록 허용해야 합니다.

set dir/.* dir/*
case $# in
  0) true;; # can't happen in a standard shell, this is for shells with nullglob
  2) { [ "$1" = "dir/.*" ] && [ "$2" = "dir/*" ] && ! [ -e "$1" ] && ! [ -L "$1" ] && ! [ -e "$2" ] && ! [ -L "$2" ]; } ||
     { [ "$1" = "dir/." ] && [ "$2" = "dir/.." ]; };;
  3) [ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ];;
  *) false;;
esac

최신 버전의 ksh를 사용하면 더 간단한 테스트가 가능하지만 AIX는 너무 오래되었다고 생각합니다(그렇다고 해도 ksh93). dir가장 가까운 ksh93이 비어 있는지 테스트하는 방법은 다음과 같습니다 .

FIGNORE='.?(.)'; set -- ~(N)dir/*; [[ $# -eq 0 ]]

또는 대안적으로

FIGNORE=; set -- dir/*; [[ $# -eq 2 ]]

대안은 를 호출하는 것입니다 find. 이는 find도트 파일이 특별히 처리되지 않고 단일 파일과 일치하는 패턴과 아무것도 일치하지 않기 때문에 확장되지 않는 패턴을 쉘이 구별하는 데 어려움이 없기 때문에 더 간단합니다.

[ -z "$(find dir/. -name . -o -print | head -n 1)" ]

답변2

어떤 껍질에서든[ "$(find path_to_dir -mindepth 1)" ] || echo EMPTY

답변3

직접적인 방법은 없으며 도트 파일도 고려할지 여부에 따라 다릅니다. 이(또는 그 변형)는 원하는 대로 작동할 수 있습니다.

set directory/*
[[ -f $1 ]] || print empty

답변4

이것은 많은 Unix에서 작동하는 기능입니다.

Bourne 호환 케이스(선사시대 모델도 포함)의 경우,

그리고 너무 깊게(파일 시스템, CPU 및 두뇌) 드릴링하지 않고 다음을 수행합니다.

isempty() { [ -z "`find \"$1/.\" ! -name . -print -prune | head -1`" ] ; }

관련 정보