最も古いファイルを削除する

最も古いファイルを削除する

ディレクトリから古いファイルを削除し、最新の 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とそのglob 修飾子:Om年齢の降順 (つまり、最も古い順) で並べ替え、[1,3]最初の 3 つの一致のみを保持します。

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

参照zshでglobをフィルタリングするにはどうすればいいですかその他の例については、こちらをご覧ください。

そして注意してくださいl0b0のアドバイス: ファイル名にシェルの特殊文字が含まれている場合、コードがひどく壊れてしまいます。

答え4

まず、-Rオプションは再帰用ですが、これはおそらく必要なことではありません。すべてのサブディレクトリも検索することになります。次に、演算子<(リダイレクトとして認識されていない場合) は文字列比較用です。おそらく、 が必要です-lt。次を試してください。

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

しかし、ここでは find を使用します:

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

関連情報