回答:
ファイルをループする場合は、*を使用しないでください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
。
((++counter>3))
、テストとして試してください。それはうまく簡潔です。ワンライナーに関して:簡潔さを気にする場合は、コードを関数でラップすることで心配する必要はありません。
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])
これまでで最も簡単な方法は、そのzshの使用することですグロブ修飾子:Om
ソートに年齢を減少させることによって(すなわち古い順)と[1,3]
のみ最初の3つの試合を保持します。
rm ./*(Om[1,3])
その他の例については、zshでグロブをフィルタリングする方法も参照してください。
l0b0のアドバイスに注意してください。シェルの特殊文字を含むファイル名があると、コードがひどく壊れてしまいます。
次の関数を使用して、ディレクトリ内の最新のファイルを取得できます。
newest_in()
{
local newest=$1
for f;do [[ $f -nt $newest ]] && newest="$f"; done;
printf '%s\n' "$newest"
}
各反復後に最新のファイルを除外することにより、異なるファイルセットを提供します。
ヒント:「$ {files [@]}」と呼ばれる配列にファイルの初期セットを保持している場合は、見つかった最新のファイルのインデックスをunset 'files[index]'
次の反復の前に保存します。
使用法: newest_in [set of files/directories]
出力例:
[rany$] newest_in ./*
foo.txt
[rany$]
まず、-R
オプションは再帰ですが、これはおそらく望んでいるものではありません。すべてのサブディレクトリも検索されます。次に、<
演算子(リダイレクトとして表示されない場合)は文字列比較用です。あなたはおそらく望み-lt
ます。試してください:
while [ `ls -1A | grep ^- | wc -l` -lt 3 ]
しかし、私はここでfindを使用します:
while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]
私はそれが解析する罪であることを知っていますls
、しかしこれはどうですか:
find . -type f -maxdepth 1 | xargs ls -ltr | sed '1,3d' | awk '{print $9}' | xargs rm
5つの空のファイルを使用した簡単なテスト:
$ >1
$ >2
$ >3
$ >4
$ >5
$ find . -type f -maxdepth 1 | xargs ls -lt | sed '1,3d' | awk '{print $9}' | xargs rm
$ ls -1
3
4
5
ls
た出力をし、使用find
し、xargs
間違った方法で一緒に。あなたが結合した場合find
とxargs
、私は使用することをお勧めいたしますfind
秒-print0
それに応じてxargs
の-O
オプション。件名の詳細については、「検索の使用」をお読みください。また、lsの解析が非常に悪い理由を調べて読むこともできます。
このワンライナーは私が思うすべてのことを行います:
ls -t1 /home/user/test | tail -n +4 | xargs -I{} rm -- "{}"
これが1つの解決策です。
rm /appserver/webapplogs/$(ls -t1 /appserver/webapplogs/|tail -1)