フォルダを削除しますが、7日前の最新フォルダ20個を保持します。

フォルダを削除しますが、7日前の最新フォルダ20個を保持します。

7日以上のフォルダを削除しますが、常に最新のフォルダを20個保持する方法を探しています。 _SAME_NAME_@tmpに似た名前のフォルダも削除する必要があります。

私はそれが20個のフォルダになるようにし、月が過ぎても削除されないようにしなければならないと主張します。私はまだ入れ子になったwhileループ構文のために苦労しています。よろしくお願いします。

#!/bin/bash

folders=`ls -A /folder/folder1  | sort -n > /tmp/test.txt`
NUMofFolders=`wc -l /tmp/test.txt | awk '{print $1}'`

if [ $NUMofFolders -lt 20 ] ;
then
 echo "Only 20 folders exist"
 exit 1
else
echo "Runing with the script"

fi

input="/tmp/test.txt"
FolderPATH="/folder/folder1"
count=$(find $Folders -maxdepth 1 -type d -mtime +7 -printf '%Ts\t%P\n' -exec egrep -v "*@tmp" '{}' + | wc -l)

while IFS= read -r line ;
do
while [ "$count" -gt "20" ] ;
do
  find /folder/folder1/"$line" -maxdepth 1 -type d -mtime +7 -printf '%Ts\t%P\n' {} \;
      do
        find $FolderPATH -maxdepth 1 -type d -mtime +7 -print -delete -quit
        count=$((--count))
        rm -rf $FolderPATH@tmp

      done
  done < "$input"

ベストアンサー1

stat以下を使用してディレクトリの実行時間を取得する必要があります。解析されないls

seven_days=$(date -d '7 days ago' '+%s')
stat -c "%Y %%n" /folder/folder1/*/ | sort -nr | tail -n +20 | while read -r mtime name; do
    if (( mtime < seven_days )); then
        echo "remove directory $name"
    fi
done

statmtimeとフォルダ名が出力されます。
次に、mtimeに基づいて最新の項目から古い項目までソートします。
その後、最初の20件の結果を無視します。
その後、ループはフォルダのmtimeを1週間前の時間と比較して、それを保持するか削除するかを決定します。

出力で正しいディレクトリを見つけたら、そのecho行を変更して実際に削除します。

おすすめ記事