
ディレクトリ内のファイルを一覧表示するかどうかを検討してください。
drwx--x--x 43 root wheel 4.0K Aug 18 12:52 ..
-rw------- 1 root root 268K Aug 18 04:31 build_locale_databases_log
-rw------- 1 root root 5.2M Aug 18 17:21 access_log
-rw------- 1 root root 85K Aug 18 17:14 cpbackup_transporter.log
-rw------- 1 root root 2.1M Aug 18 05:49 cphulkd.log
-rw------- 1 root root 3.2M Aug 18 17:19 error_log
-rw------- 1 root root 1.7M Aug 18 12:52 license_log
ここでは2Mb
。 (つまり)次のファイルのファイルサイズをゼロバイトにします。
access_log
cphulkd.log
error_log
答え1
私は直接の質問に最初に答えるのが好きですが、私の答えを読む前にこのコマンドを実行しないでください。あなたが要求したコマンド(おそらく望むものではないかもしれません)は次のとおりです。
find /wherever -type f -name '*.log' -size +4096 -print \
| xargs truncate --size 0
+4096は、ファイルに512バイトの4096を超えるセクタがあることを意味します。問題は、これがプロセスがアクティブに記録されているログファイルである場合、そのプロセスがファイル内のその場所を保持することです。ディスク領域を回復できますが(ファイルシステムがほとんどのファイルシステムがサポートするスパースファイルをサポートしていると仮定します)、ログを見ると最初はブロックがゼロです。したがって、これを実行したらすぐにデーモンを再起動する必要があります。あるいは、ファイルを邪魔にならない場所に移動してデーモンを再起動する方が良いでしょう。
cd /wherever
find . -name '*.log' -maxdepth 1 -size +4096 -exec mv {} {}.old \;
systemctl restart yourservice (or whatever you need to restart)
rm -f *.old
答え2
findコマンドを使用してこれを実行できます。
for i in $(find . -type f -size +2097152c);do cat /dev/null > $i;done
find コマンドは、find . -type f -size +2097152c
サイズが次より大きいすべてのファイルを検索します。
2MB(2097152バイト)
for ループは find コマンドから取得したファイルのリストを繰り返し、次を使用します。cat /dev/null
- - - 編集する - - -
user3188445が提案したように、この方法を試すこともできます。
for i in $(find . -type f -size +2097152c);do : > $i;done
答え3
正しい:
find . ! -name . -prune -type f -size +2097152c -exec sh -c '
for f do
: > "$f"
done
' sh {} +
GNU 検索または BSD 検索を使用します。
find . -maxdepth 1 -type f -size +2M ...
答え4
私は次のことを思い出しました。
find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done
これはうまくいきます。