web-dev-qa-db-ja.com

Linuxで多数の0バイトファイルを削除するにはどうすればよいですか?

多数の0バイトファイルが含まれるディレクトリがあります。 lsコマンドを使用してもファイルが表示されません。私はこれらのファイルを削除するために小さなスクリプトを使用していますが、時にはこれらのファイルさえ削除しないことがあります。スクリプトは次のとおりです。

i=100
while [ $i -le 999 ];do
    rm -f file${i}*;
    let i++;
done

これをより迅速に行う他の方法はありますか?

51
small_ticket

findと組み合わせてxargsを使用します。

find . -name 'file*' -size 0 -print0 | xargs -0 rm

すべてのファイルに対してrmを開始することは避けてください。

115
Didier Trosset

GNUのfind(コメントを参照)では、xargsを使用する必要はありません。

find -name 'file*' -size 0 -delete
75
coredump

次のコマンドを使用できます。

見つける。 -maxdepth 1 -size 0c -exec rm {} \;

また、サブディレクトリの0バイトファイルも削除する場合は、前のコマンドで-maxdepth 1を省略して実行します。

6
jitendra
find . -maxdepth 1 -type f -size 0 -delete

これにより、サブディレクトリに入ることなく、現在のディレクトリでサイズ0のファイルが検索され、削除されます。

ファイルを削除せずにリストするには:

find . -maxdepth 1 -type f -size 0
4
user7194913

現在のディレクトリにあるfile ...という名前のファイルをすべて削除します。

find . -name file* -maxdepth 1 -exec rm {} \;

すべてのファイルに対してrmを開始するため、これにはまだ時間がかかります。

4
Sjoerd

フォルダー内のすべての0バイトファイルを検索して削除する場合:

find /path/to/folder -size 0 -delete
3
Lão Còi

ファイルを削除するオプション-deleteを使用することもできます。

man findから-deleteファイルを削除します。削除が成功した場合はtrue。

2
thegeek

以下に例を示します。自分で試してみると意味がわかります。

bash-2.05b$ touch empty1 empty2 empty3
bash-2.05b$ cat > fileWithData1
Data Here
bash-2.05b$ ls -l
total 0
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty1
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty2
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty3
-rw-rw-r--    1 user group          10 Jul  1 12:51 fileWithData1
bash-2.05b$ find . -size 0 -exec rm {} \;
bash-2.05b$ ls -l
total 0
-rw-rw-r--    1 user group          10 Jul  1 12:51 fileWithData1

Findのマニュアルページを見る場合(タイプman find)、このコマンドの強力なオプションの配列が表示されます。

1
Noel M

レベルを上げると、ファイルが存在する理由を把握する価値があります。症状を削除するだけで治療することになります。何らかのプログラムがリソースをロックするためにそれらを使用している場合はどうなりますか?その場合、それらを削除すると破損する可能性があります。

lsofは、空のファイルを処理するプロセスを特定する方法の1つです。

0
Paul Rubel

"...これらのファイルを削除しないこともあります"は、これがあなたが定期的に行うことだと思うようにします。その場合、このPerlスクリプトは、現在のディレクトリにあるゼロバイトの通常ファイルをすべて削除します。システムコール(リンク解除)を使用してrmを完全に回避し、非常に高速です。

#!/usr/bin/env Perl
use warnings;
use strict;

my @files = glob "* .*";
for (@files) {
    next unless -e and -f;
    unlink if -z;
}
0
andereld