次の方法を使用して、フォルダが空であることを確認します。
[[ "$(ls -A /var/folder)" ]] && echo "not empty"
で、/var/folder
我々は以下を行った。
ls -l /var/folder
total 0
実際、我々は何の結果も得られない。
しかし、シェルを実行すると
[[ "$(ls -A /var/folder)" ]] && echo "not empty"
その後、印刷されます。
not empty
だから私たちは、フォルダに次の点があるファイルが含まれていることを発見しました。
ls -la /var/folder
total 4
drwxr-xr-x 2 kafka kafka 47 Jan 19 17:23 .
drwxr-xr-x 42 kafka kafka 4096 Jan 19 10:25 ..
-rw-r--r-- 1 kafka kafka 0 Jan 19 17:22 .kafka_cleanshutdown
-rw-r--r-- 1 kafka kafka 0 Jan 19 15:16 .lock
したがって、問題は、フォルダが空であることを確認しながら、「.」で始まるファイルの存在を無視する方法です。
ベストアンサー1
ドットファイルを見たくない場合は無視してください-A
!
[[ "$(ls /var/folder)" ]] && echo "not empty"
しかし、使用する必要さえありませんls
。シェルで完全に実行できます。
file_list=(/var/folder/*)
[[ "${file_list[*]}" != "/var/folder/*" ]] && echo "not empty"
これは/var/folder/*
ワイルドカードパターン(「glob」)を拡張します。非表示のファイルがある場合は、file_list
そのファイルの名前のリストになります。そうでなければ、それはfile_list
リテラル文字列にすぎません/var/folder/*
。
ここにはバグがあります。ディレクトリにリテラル文字列となるliteral*
というファイルが含まれている場合、上記のコードは失敗します(ディレクトリが空であることを示します)。次の手順でこの問題を解決できます。${file_list[*]}
/var/folder/*
shopt -s nullglob
file_list=(/var/folder/*)
[[ "${file_list[*]}" != "" ]] && echo "not empty"
shopt -u nullglob
もちろん、強力なスクリプトは設定を最初に確認してnullglob
から、キャンセルするのではなく最後に復元します。
これはbash用に書かれており、すべてのシェルで機能するわけではありません。