.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
ディレクトリ内のすべてを削除したことを思い出します)
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 .
は失敗して終了します。独自の終了コードではなく、stdout
のfind
に依存しなければならない理由は、ケースファイルで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
を使用したソリューションはおそらくより高速だと思いますが、テストしていません。
GNU findはこれを可能にします
find . -maxdepth 0 -empty -exec echo {} is empty. \;
かなり速く、パイプなし
申し訳ありませんが、ドミニクのコメントにコメントで答えるのに十分な担当者がいないため、これが私ができる最善の方法です...
Solarisでのfindにはmaxdepthオプションがありません...どうすれば同じことができますか? –ドミニク11月14日12時46分
以前のバージョンでは確かに言えませんが、Solaris 10以上では:
find . ! -name . -Prune