フォルダ内の古いファイルを削除するbashスクリプトを作成したいと思います。スクリプトを実行するたびに、古いファイルが1つだけ削除されます。この問題を解決するのに役立ちますか?ありがとう
答え1
Coaseが指摘したように、(作成日の点で)最も古いファイルを知ることは不可能かもしれません。
修正時間が適切で、ファイル名に新しい行がない場合:
rm -- "$(ls -rt | head -n 1)"
(ファイル名を制御できない場合ls出力を慎重に解析してください。)
隠しファイルも考慮するかどうかのオプションを追加します-A
。ls
GNU coreutils 9.0以降、GNUにはNULで区切られたファイル名を一覧表示するオプションがls
あるため--zero
、これらの最新バージョンとbashまたはzshをシェルとして使用すると、すべてのファイル名を使用できるバージョンは次のとおりです。
IFS= read -rd '' file < <(ls --zero -rt) &&
rm -- "$file"
これらの最新バージョンには、--time=birth
一部のシステムおよびファイルシステム(ほとんどの基本ファイルシステムにある最新のGNU / Linuxシステムを含む)で作成時間に基づいてソートする機能もあります。
答え2
最も古い修正ファイルは削除できますが、最も古いファイルは削除できないようです。
利用可能であり、ユーティリティのGNU実装に関係なく、stat
これは改行文字を含むファイル名で中断されないので、最も安全なアプローチだと思います。sort
sed
xargs
stat --printf='%Y %n\0' ./* | sort -zn | sed -z 's/[^ ]\{1,\} //;q' | xargs -r0 rm
stat --printf='%.Y %n\0' ./*
:NULで区切られた最後の修正時間のリスト(できるだけ正確に)を印刷し、その後に現在の作業ディレクトリに隠されていない各ファイルのファイルパスを印刷します。ファイル名が次に始まる問題を./
回避するためにプレフィックスが付いています-
(--
GNUのstat
場合、ファイルは呼び出されたものは-
依然として意味があると解釈されます)。標準入力);sort -zn
n
: NUL を行区切り文字として使用して、リストを数値でソートします。sed -z 's/[^ ]\{1,\} //;q'
:最初のNUL終了行から、空白以外の1つ以上の文字を含む文字列の最初の項目を削除し、q
最初の行を処理して印刷してから削除します。xargs -r0 rm
rm
:NULで終わる行は、その行が存在する場合にのみ引数として渡されます。
% touch file1
% touch file2
% stat -c '%.Y %n' ./*
1447318965.123211222 ./file1
1447318965.784234234 ./file2
% stat --printf='%.Y %n\0' ./* | sort -zn | sed -z 's/[^ ]\{1,\} //;q' | xargs -r0 rm
% ls
file2
答え3
「アクセス時間」または「修正時間」に基づいて最も古いファイルを決定しますか?
2番目の場合は、次のコマンドを使用します。
rm ls -l --sort=time | sed -n 2p | awk '{print $NF}'
答え4
では、zsh
ファイル名に含まれる文字または非文字に関係なく機能します。
rm -- *(Om[1])
最後の修正時間(たとえば、forなどの最も古いものから最新のものまで)Om
O
に基づいて逆順に並べ替え、最初の一致に拡張を制限します。m
ls -rt
[1]
または:
rm -- *(-Om[1])
シンボリックリンクを確認してから修正時間を考慮してください(-L
オプションを使用している場合ls
)。
rm -- *(Om[1]^/)
ファイルタイプの除外目次(とにかくrm
削除できません-r
)-
シンボリックリンクが解決された後のタイプと期間を考慮するには、プレフィックスを再使用してください。D
隠しファイルを考慮するには、修飾子を参照してください.
。定期的なファイルのみ。
bash
または他のシェルからzsh -c 'those codes above'
。