上記のフォルダパスを考慮して、特定の日数を過ぎたファイルを削除するスクリプトを作成しようとしています。私は単にパスをハードコーディングするよりも、より高度な技術を使用しようとしています(実際のケースには多くのフォルダがあります)。これが私が今まで持っているものです:
#!/bin/bash
FILEAGE=15
#Array of folders to clean
dir_array=(
"/srv/*/folderA"
"/srv/level1D/*/folderA"
)
#function to be used for deleting files. Needs to be called with a path
function dir_delete() {
echo "Deleting:"
find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
echo ""
}
echo "##### Looping through dir_array array and using dir_delete function to delete files older than $FILEAGE days #####"
for d in "${dir_array[@]}";do
if [ -d $d ];then
echo "##### Deleting all files older than $FILEAGE in $d #####"
dir_delete $d
else
echo "##### Did not find directory: \$d #####"
echo ""
fi
done
私のスクリプトは、次のディレクトリが見つからないと返します。
Did not find directory: /srv/*/folderA
注:このフォルダには15日間削除できないファイルが含まれています。
修正する
@Kusalanandaの提案を使用して'/srv/'*'/folderA'
問題を解決しました。私が間違っていることを知りたい人がいる場合は、上記の元の投稿に間違ったコードを残しました。
ベストアンサー1
シェルグローブパターンは*
二重引用符内では拡張されません。これはループを意味します
for d in "${dir_array[@]}";do
屋根模様。を呼び出すときはdir_delete
引用符なしのパターンを使用するため、そこから拡張されます(ただし、それは決して到達しません)。ただし、この関数は最初のもののみを使用します。言葉通貨パターンに一致するすべてfind
。
本当に驚くべきことは、これらのパターンがテストでも拡張されることです。テストでは、テストにのみ必要なものだけが必要[ -d $d ]
なので厄介です。-d
一つパス名。これがスクリプトが最終的に失敗する理由です。
代わりに、次に割り当てるときにスキーマが正しく拡張されていることを確認してくださいdir_array
。
dir_array=(
/srv/*/folderA
/srv/level1D/*/folderA
)
パス名の他の部分にスペースなどが含まれている場合は、folderA
パス名の対応する部分を引用する必要がありますが、*
引用しないでください。
また、引用する必要がない状況を知らない限り、すべての変数の拡張を二重引用符で囲む必要があります。
次の行に引用の問題があるかもしれません。
if [ -d $d ];then
find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
dir_delete $d
また、可変データを出力するときprintf
に代わりに使用することも検討してください。echo
関連: