X日より古いYYYY-MM-DDというディレクトリを見つけて、そのディレクトリがある場合は削除します。

X日より古いYYYY-MM-DDというディレクトリを見つけて、そのディレクトリがある場合は削除します。

X私はファイル名に基づいて数日より古いディレクトリを見つけて削除するライナーbashスクリプトを作成しましたが、ディレクトリが存在する場合はコードが完全に機能します。唯一の問題は、ディレクトリが存在しない場合はディレクトリを削除しようとし、エラーが発生することです。

find: ‘/var/www/html/resources/cache/2022-02-08’: No such file or directory

findコマンドの結果にディレクトリが存在するかどうかを確認して削除する条件を入れましたが。

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' -exec sh -c 'd={}; [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ] && [ -d $d ] && rm -rf $d' \;

次のディレクトリが次の場所にあるとします。/var/www/html/resources/cache

2022-02-08
2022-02-09
2022-02-10
2022-02-11
2022-02-12
2022-02-13
2022-02-14
2022-02-15

[ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ]ファイル名が6日より古いことを確認してください。

[ -d $d ]ディレクトリであることを確認してください。

ベストアンサー1

オプションxargsの代わりにコマンドを使用できます。-execfind

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' | xargs -I {} sh -c 'd={}; [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ] && [ -d $d ] && rm -rf $d'

上記のコードブロックは機能しますが、123値として返すことができます。繰り返されるコマンドに対してエラーが発生すると、xargsコマンドが返されます。123そのため、6日を過ぎていないディレクトリ名があるとエラーが発生します。

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' | xargs -I {} sh -c 'd={}; if [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ]; then [ -d $d ] && rm -rf $d; fi'

if条件をステートメントで置き換えることで、この問題を解決できます。

おすすめ記事