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`" ] ; }