web-dev-qa-db-ja.com

最大サイズのものを除いて、プレフィックスが付いているすべてのファイルを削除します

このプレフィックスが付いているが、このプレフィックスが付いているすべてのファイルの中で最大サイズのファイルを除いて、プレフィックスが付いている現在のディレクトリ内のすべてのファイルを削除する最良の方法は何ですか?

(最大のものが一意でない場合は、ランダムに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
6
D. Chen

いくつかのユーティリティを組み合わせて使用​​できます。

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はファイル名のみを取得し、rmxargs rm)は削除を行います

7
heemayl

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オプションを追加し、シンボリックリンクのターゲットのサイズを検討します。

7