このプレフィックスが付いているが、このプレフィックスが付いているすべてのファイルの中で最大サイズのファイルを除いて、プレフィックスが付いている現在のディレクトリ内のすべてのファイルを削除する最良の方法は何ですか?
(最大のものが一意でない場合は、ランダムに1つを保持し、他を削除します。)
たとえば、現在のディレクトリには次のファイルが含まれています。
-rw-rw---- 1 user user 3468 Jan 01 00:00 filea
-rw-rw---- 1 user user 3434 Jan 01 00:00 pre_0
-rw-rw-r-- 1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r-- 1 user user 1950 Jan 01 00:00 filec
-rw-rw-r-- 1 user user 8654 Jan 01 00:00 pre_1
-rw-rw---- 1 user user 6508 Jan 01 00:00 pre_2
コマンドまたはスクリプトを実行して、プレフィックスが「pre_」のファイルをすべて削除した後、現在のディレクトリは次のように表示されます。
-rw-rw---- 1 user user 3468 Jan 01 00:00 filea
-rw-rw-r-- 1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r-- 1 user user 1950 Jan 01 00:00 filec
-rw-rw-r-- 1 user user 8654 Jan 01 00:00 pre_1
いくつかのユーティリティを組み合わせて使用できます。
stat -c '%s %n' pre_* | sort -k1,1rn | tail -n +2 | cut -d' ' -f2 | xargs rm
GNUシステムで、異常なファイル名がないと仮定します。
stat
は、すべてのpre_*
ファイルのファイルサイズと名前をスペースで区切って取得します
sort
はファイルサイズに従ってファイルをソートし、最も大きいサイズのものが一番上に移動します
tail -n +2
は、最大サイズのファイル以外の残りのファイルを取得します
cut -d' ' -f2
はファイル名のみを取得し、rm
(xargs rm
)は削除を行います
zsh
の場合:
rm -f pre*(OL[2,-1])
OL
:サイズの逆順[2,-1]
:最後から2番目のみbash
およびGNUユーティリティと同等のものは次のようになります:
eval "files=($(LC_ALL=C ls --quoting-style=Shell-always -dS ./pre*))"
rm -f "${files[@]:1}"
非正規ファイルのサイズは一般的にあまり関連性がないため、通常のファイルに制限することをお勧めします。
rm -f pre*(.OL[2,-1])
(直接bash + GNUに相当するものはありません)。通常のファイルへのシンボリックリンクを含めて、シンボリックリンクのターゲットのサイズを検討することをお勧めします。
rm -f pre*(-.OL[2,-1])
ls
を使用して、-L
オプションを追加し、シンボリックリンクのターゲットのサイズを検討します。