修正する

修正する

ここに画像の説明を入力してください。

上記のフォルダパスを考慮して、特定の日数を過ぎたファイルを削除するスクリプトを作成しようとしています。私は単にパスをハードコーディングするよりも、より高度な技術を使用しようとしています(実際のケースには多くのフォルダがあります)。これが私が今まで持っているものです:

#!/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

関連:

おすすめ記事