最も古いファイルの削除

最も古いファイルの削除

ディレクトリから古いファイルを削除し、最新の3つのファイルのみを残そうとします。

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

条件文に問題があります。

答え1

ファイルを繰り返したい場合は、絶対に使用しないでくださいls*。 tl;dr ほとんどの場合、誤ったファイルを削除したり、すべてのファイルを削除したりします。

残念ながら、これはBashで難しいことです。可能な答えがあります質問が重複しています。 私は年をとるfind_date_sorted少し変更して使用できます。

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

*攻撃しようとする意図はありません。ls以前これを使ったことがあります。しかし、実際には安全ではありません。

編集する:新しいfind_date_sorted単体テストとして。

答え2

zsh globを使用して3つのファイルを除くすべてのファイルを削除するにはOm(大文字のO)を使用して、最も古いファイルから最新のファイルまでソートし、下付き文字を使用して目的のファイルを取得できます。

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

他の例:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

答え3

これまでの最も簡単な方法はzshとその機能を使用することです。グローバル予選Om年齢に基づいて降順(たとえば、最も古いものなど)で並べ替え、[1,3]最初の3つの一致のみを保持します。

rm ./*(Om[1,3])

また、見ることができますzshでグローブをフィルタリングする方法より多くの例を学びましょう。

そして参考l0b0の提案:ファイル名にシェル特殊文字が含まれていると、コードが激しくクラッシュします。

答え4

まず、この-Rオプションは再帰のために望むものではないかもしれません。また、すべてのサブディレクトリでも検索します。次に、<演算子(リダイレクトと見なされない場合)が文字列比較に使用されます。あなたが望むかもしれません-lt。努力する:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

しかし、ここではfindを使います。

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

関連情報