配列に保存されている複数のディレクトリを消去しようとしています。以下は簡単な例です(より多くのディレクトリがあります)。
#!/bin/bash
$IMAGES_DIR="/Users/michael/scripts/imagefiles"
$BACKUP_DIR="/Users/michael/scripts/imagebackups"
...
array=( $IMAGES_DIR $BACKUP_DIR )
for i in ${array[@]}
do
if [ "$(ls -A $i)" ]; then # check that directory has files in it
rm "$i/"* # remove them
fi
done
各ディレクトリに対して、次のエラーが発生します。
rm: /Users/michael/scripts/imagefiles/*: そのファイルやディレクトリはありません。
ベストアンサー1
1つのコマンドですべてを行うのはどうですか?
単一の呼び出しでファイルの存在確認、グロービング、削除をキャプチャできますfind
。 GNUバージョンの場合、find
次のものがあります。
for f in "${array[@]}"; do
find "$f" -type f -delete
done
GNU がない場合は、find
次の呼び出しを使用します。
find "$f" -type f -exec rm -f {} +
(ディレクトリ階層全体でファイルを消去せずに直接サブファイルのみを消去する場合は、-maxdepth 1
前に追加してください-type f
。)
しかし、待って、もっとあります…
〜のようにJohn1024は賢明に指摘しています。配列を最初の引数として渡すことで、ループを完全に中断できますfind
。
find "${array[@]}" -type f -delete
その理由は次のとおりです。1) find
1回の実行で複数のディレクトリを検索して処理できます。2)シェルは、各要素(ディレクトリ)が別々の位置引数になるように配列を分割しますfind
。