
現在のディレクトリから特定のプレフィックスを持つすべてのファイルを削除する最善の方法は何ですか?
(最も大きいものが一意でない場合は、ランダムに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
答え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
答え2
そしてzsh
:
rm -f pre*(OL[2,-1])
OL
:サイズが小さい順に[2,-1]
:最後から2番目だけ
GNUユーティリティに対応する機能はbash
次のようになります。
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