
ディレクトリ内の最も大きいファイルを特定数削除したいと思います。
最初の 10 個のファイル名を取得するには、次のようにします。
ls -S | head
(または解析がより複雑ではあるものの、より豊富なものls -lS | head
)
これらを xargs 経由で rm に渡すにはどうすればいいでしょうか?
それで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 を搭載したマシンにアクセスできないため、OS X ではstat
サイズを取得するための形式が異なるというリスクがあるかもしれません。つまり、--format "%s"
オプションが機能しない可能性があります。OS man stat
X で確認してください。
答え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 バリアントでは別途インストールする必要がある場合があります。
名前以外の基準でファイルを選択(および並べ替え)する方法はglob 修飾子たとえば、ディレクトリ内の最も大きい10個のファイルを一覧表示するには、を使用してOL
サイズの降順で並べ替えます(l長さを指定して[1,10]
最初の 10 個をリストします。
ls -ldU *(OL[1,10])
zsh を使わずにこれを行うのは、特に特殊文字を含むファイル名を処理する必要がある場合は、より複雑になります。ファイル名に印刷できない文字や改行が含まれていない限り、 の出力を解析できますls
。
ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done