web-dev-qa-db-ja.com

フォルダーにコンテンツがあるかどうかを確認するbash

.wasteディレクトリ内のすべてを削除するBashスクリプトを作成しようとしています。私が書いた基本的なスクリプトがありますが、最初に.wasteディレクトリにコンテンツがあるかどうかをチェックし、もしそうなら、簡単な"Folder already empty!"メッセージをエコーアウトしたいです。 ifおよびif elseステートメントについてはあまり詳しくないので、[ ]方程式が存在を確認するために必要なものがわかりません。

基本コード:

#! /bin/bash
echo "The files have been deleted:"
cd /home/user/bin/.waste/
ls
rm -rf /home/user/bin/.waste/*

(P.S.最後にアスタリスクが正しいかどうかわからないので、スクリプトを試してみましたが、binディレクトリ内のすべてを削除したことを思い出します)

36
Syler

findを使用してディレクトリが空かどうかを確認し、その出力を処理できます。

#!/bin/sh
target=$1
if find "$target" -mindepth 1 -print -quit 2>/dev/null | grep -q .; then
    echo "Not empty, do something"
else
    echo "Target '$target' is empty or not a directory"
fi

あれは:

  • findを使用して、$target-mindepth 1)の下にある最初のファイルシステムエントリを見つけ、印刷(-print)し、処理を停止(-quit
    • stderrをリダイレクトして、エラーメッセージ(=ノイズ)を抑制します
  • grep -q . を使用して、findコマンドの出力が空かどうかを確認します。
    • grep -q .は、最大1文字を処理した後に終了します。文字が見つかった場合は成功して終了し、文字がなければ(入力が空の場合)失敗して終了します。
  • findコマンドの出力が空でない場合、ディレクトリは空ではなく、grep -q .は正常に終了します。
  • findコマンドの出力が空の場合、$targetは空のディレクトリであるか、ディレクトリではなく(存在しない)、grep -q .は失敗して終了します。

独自の終了コードではなく、stdoutfindに依存しなければならない理由は、ケースファイルでfindコマンドに区別可能な終了コードを使用させる方法がないためです。発見されたかどうか。

grep -qにパイプする代わりに、findの出力をキャプチャし、それが空の文字列かどうかを確認することもできます。

#!/bin/sh
target=$1
if [ "$(find "$target" -mindepth 1 -print -quit 2>/dev/null)" ]; then
    echo "Not empty, do something"
else
    echo "Target '$target' is empty or not a directory"
fi

このようなコマンド出力をキャプチャするには、サブシェルを使用します。 grepを使用したソリューションはおそらくより高速だと思いますが、テストしていません。

41
janos

GNU findはこれを可能にします

find . -maxdepth 0 -empty -exec echo {} is empty. \;

かなり速く、パイプなし

15
kdubs

申し訳ありませんが、ドミニクのコメントにコメントで答えるのに十分な担当者がいないため、これが私ができる最善の方法です...

Solarisでのfindにはmaxdepthオプションがありません...どうすれば同じことができますか? –ドミニク11月14日12時46分

以前のバージョンでは確かに言えませんが、Solaris 10以上では:

find . ! -name . -Prune 
4
Reese Murdock