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