複数のディレクトリを消去するには、rmを使用してください。

複数のディレクトリを消去するには、rmを使用してください。

配列に保存されている複数のディレクトリを消去しようとしています。以下は簡単な例です(より多くのディレクトリがあります)。

#!/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) find1回の実行で複数のディレクトリを検索して処理できます。2)シェルは、各要素(ディレクトリ)が別々の位置引数になるように配列を分割しますfind

おすすめ記事