
ディレクトリから特定の数の最大ファイルを削除したいと思います。
以下を使用して上位10個のファイル名を取得できます。
ls -S | head
(またはより豊富ですが、より複雑な解析ls -lS | head
)
rmにどのように渡すのですか? xargsを介して?
それでls -S | head | xargs rm
動作します(ファイル名にスペースなどがありますか?)。
より良い/安全な方法はありますか?
申し訳ありません。間違えるかどうか直接テストすることはできません(ディレクトリには削除したくない項目があります)。
私はmacOSを使用しています。
答え1
それで
ls -S | head | xargs rm
動作します(ファイル名にスペースなどがありますか?)。
いいえ。xargs
デフォルトでは、改行文字だけでなくすべてのスペースに分割されます。そして、すべての引数がスペースで区切られて印刷される| xargs echo
ため、これは表示されません。echo
(このような方法は改行| xargs printf "%s\n"
で区切って印刷するため、ファイル名の途中で分割が発生するかどうかを確認できます。)
少なくとも、GNU xargsは-d '\n'
改行文字に分割する必要があり、多くのバージョンのxargsは-0
NUL文字(と連携してfind -print0
)に分割する必要があります。少なくとも最初の項目が必要ですが、通常、ファイル名に改行文字を含めることもできます。この場合、head
大きな利点はありません。
私はあなたに警告する義務があります解析された出力はls
無効と見なされます。、改行文字がなくても、少なくとも一部のバージョンでは出力が中断されるようです。 (しかし、改行文字や印刷できない文字がなければ、おそらく安全でしょう。おそらく。)
答え2
私は別のアプローチを使用します。このような:
size=20000 # set a limit (in bytes), above these we will delete
for file in *
do
[[ -f "$file" ]] || continue
fileSize=$(stat --format "%s" "$file")
if (( $fileSize > $size )) # if file is bigger than 20000 bytes
then
rm "$file" # delete the file
fi
done
これにより、空白のあるファイルを削除し、$size
変数を使用して実際に「大きな」ファイルを決定できます。削除するたびにメッセージを表示するには、-i
次のスイッチを使用します。rm -i
編集する:
私はOS Xでこのプログラムを実行していることに気づきました。現在、OS Xがインストールされているコンピュータにアクセスできません。stat
OS Xからサイズを取得するために他の形式がある危険性があります。つまり、この--format "%s"
オプションは機能しない可能性があります。 OS Xをチェックしてみてくださいman stat
!
答え3
私も一緒に行きます。
find . -type f -size +10M -delete -print
本当にlsパスに行きたい場合はおそらく。
ls -S | head -1 | while read af; do rm "$af"; done
答え4
使用扱いにくい。ファイルをサイズ別に(より一般的には日付別に)ソートして選択する方法があります。 ZshはOSX / macOSの標準インストールの一部ですが、他のUnixバリアントでは別々にインストールする必要があるかもしれません。
名前以外の基準を使用してファイルを選択(およびソート)する方法は次のとおりです。グローバル予選。たとえば、ディレクトリ内の最大10個のファイルを一覧表示するには、サイズの降順に並べ替えOL
(私ength)[1,10]
上位10個を一覧表示します。
ls -ldU *(OL[1,10])
zshなしでこれを行うのはより複雑です。特に、特殊文字を含むファイル名を処理する必要がある場合はさらにそうです。ファイル名に印刷できない文字や改行文字が含まれていない限り、解析できますls
。
ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done