2017-02-09 11 views
0

を実行する前に、私は本当に私ができる限り、これは同様に安全したいのですが、特定のフォルダ

上のrm -frを必要とするスクリプトを安全なチェックを持っています。私はこのスクリプトを以下から始めましたが、私が逃したことが他にあるかどうか疑問に思っていました。

folder="" 

if [[ ! -d "$folder" ]]; then 
    echo "Error: is not a folder" 
elif [[ "$folder" == "/" ]]; then 
    echo "Error: folder points to root" 
elif [[ "$folder" == "../"* ]]; then 
    echo "Error: folder start with ../" 
elif [[ "$folder" == *"/.."* ]]; then 
    echo "Error: folder contains /.." 
elif [[ "$folder" == *"/*"* ]]; then 
    echo "Error: folder ends with /*" 
else 
    rm -fr "$folder" 
fi 

更新:あなたは、可能な限り安全にしたい場合、あなたはおそらく...

は、任意のグロブが最初に行われていることを確認してください可能性があり、「/」

+2

'/'もチェックできますか? – codeforester

+0

ありがとう私はコードを更新しました! – Zurd

+0

は、指定されたユーザーの下にあるすべてのフォルダです。〜〜/ home/jsmith? – zee

答えて

0

のチェックを追加しました:

shopt -s nullglob 
declare -a folders=(folder_or_glob) 

アレイの各要素を一度に1つずつ反復し、正規パスで操作します。テストへ

for f in "${folders[@]-}" 
do 
    [[ $f ]] || continue 
    candidate="$(realpath -e -s "$f")" || continue 
    ok_to_delete "$candidate" || continue 
    rm -rf "$candidate" 
done 

利用機能ok_to_delete

ok_to_delete() 
{ 
    [[ -d $1 ]] || continue  # Is directory 
    [[ $1 !=/]] || continue # Not root 
    [[ "${1%/*}" ]] || continue # At least two levels deep 
    (... add any test you want ...) 
} 

あり、冗長性のビット(例えばないルート+ 2レベルの深さ)ここで、これはちょうどあなたのアイデアを与えることです。

0

フォルダのパス名を確認するのではなく、そのフォルダの内容、ファイルのサイズ/ユーザー/タイムスタンプ/キーワーク/拡張子などを確認したいと思います。これはより安全な方法です。これはちょうど私の2セントです。

関連する問題