directory中の大量の空ファイルの効率的な削除方法

このQ&Aのポイント
  • ファイルの容量が0か否かを判定して、それが真であれば削除する方法を探しています。
  • あるプログラムを作ったところ、必要なファイルの他に、沢山の空ファイルができてしまいました。
  • この多量にある空ファイルのみを選択的に一気に削除するには、どのようにするのが効率的でしょうか。
回答を見る
  • ベストアンサー

directory中の大量の空ファイルのみを効率よく削除するには?

あるプログラムを作ったところ、 XXX_YYY.txt (XXXは001から200、YYYは001から050) というファイル名のfailがつくられたのですが、 必要なファイルの他に、沢山の空ファイルができてしまいました。 (空ファイルが或る場合)各XXXについて、YYYのある番号以上がすべて空になっているのですが、 そのある番号はXXXによってまちまちです。 この多量にある空ファイルのみを選択的に一気に削除するには、どのようにするのが効率的でしょうか。 「ファイルの容量が0か否かを判定して、それが真であれば削除する」という シェルスクリプト、perlスクリプト、 あるいはzshのコマンドでできるのではないかとにらんでいるのですが、 よい方法を御存じの方がいましたら、教えて頂けないでしょうか。

noname#9431
noname#9431

質問者が選んだベストアンサー

  • ベストアンサー
  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

find . -size 0 -type f -print | xargs rm は如何でしょうか? 実行する前に find . -size 0 -type f -print | xargs ls -l | more とでもして、削除対象のファイルサイズを見た方が良いかも 必要に応じて find . -name \*_\*.txt -size 0 -type f -print と名前指定いれることも必要化も知れません。

noname#9431
質問者

お礼

おー、こうやってパイプで渡せばいいんですか! なるほど!勉強なりました! 早速のご回答、ありがとうございました。

関連するQ&A

  • ファイルアップローダ+複数のディレクトリを削除するシステムについて

    以下のようなフォルダ構成で、複数のディレクトリを削除するシステムを構築しよと しましたが、1ディレクトリのみしか削除できませんでした。 20090601 - xxx1.txt yyy1.txt zzz1.txt のフォルダ20090601と、ファイルxxx1.txt,yyy1.txt,zzz1.txt のみしか削除できませんでした。理想は、すべてのディレクトリ、ファイルを削除しようと、試行錯誤 しましたが、なかなかうまくいきません。 わかる人がいたら、ご教授のほどよろしくお願いします。 ============フォルダ構成==================================== 20090601 - xxx1.txt yyy1.txt zzz1.txt 20090602 - xxx2.txt yyy2.txt zzz2.txt 20090603 - xxx3.txt yyy3.txt zzz3.txt 20090604 - xxx4.txt yyy4.txt zzz4.txt $_WK_dir_name[1] = "20090601" $_WK_dir_name[2] = "20090602" $_WK_dir_name[3] = "20090603" $_WK_dir_name[4] = "20090604" ============プログラム====================================== // ファイルアップロード処理 (省略) // ディレクトリ数のカウント処理 (省略) // ディレクトリとディレクトリの中身を削除 for ($i = 1; $i < 4; $i++) { // 削除するディレクトリパスを設定 $_dir_path = './' . $_WK_dir_name[$i] . '/'; printf("★1"); // ディレクトリ・ハンドルをオープン $res_file = opendir( $_dir_path ); printf("★2"); // ディレクトリ内のファイル名を1つずつを取得 while( $file_name = readdir( $res_file ) ){ // ファイルかどうか判定する if (is_file($_dir_path . $file_name)) { unlink($_dir_path . $file_name); } } printf("★3"); closedir( $res_file ); printf("★4"); rewinddir( $res_file ); printf("★5"); // ディレクトリの中身が空になったところで、ディレクトリを削除する。 rmdir($_WK_dir_name[$i]); printf("★6"); } ============================================================

    • ベストアンサー
    • PHP
  • MSDOSコマンドでディレクトリ内をきれいにしたい

    DOSコマンドで複数のファイルとサブディレクトリをすべてどこかのディレクトリに移動するのと削除するにはどのようなコマンドになりますでしょうか? 複数行のバッチファイルにすることを想定しておりますので複数コマンドになってもOKです。 del,moveコマンドやrmdirだけでは対応できなそうなので、、、。 (1) C:\TEST\ C:\TEST\a.txt C:\TEST\b.txt C:\TEST\XXX\xxx.txt C:\TEST\YYY\yyy.txt を C:\TEST_NEW\ C:\TEST_NEW\a.txt C:\TEST_NEW\b.txt C:\TEST_NEW\XXX\xxx.txt C:\TEST_NEW\YYY\yyy.txt に移動したいのと (2) C:\TEST\ C:\TEST\a.txt C:\TEST\b.txt C:\TEST\XXX\xxx.txt C:\TEST\YYY\yyy.txt を C:TEST\ 内を空っぽにしたいです。 C:\TEST\ の中身は毎回変わり(上記a,b,XXX,YYY,xxx,yyyの名前が変わる)、(1)と(2)のバッチファイルを作って、ときどき C:TEST\をきれいにしたいです。

  • ファイルの削除について ( unlink )

    perl プログラミング 2日目の初心者です。 以下のようなスクリプトを書いて test.cgi とかで $del_count = unlink glob("msg-*.txt"); 保存し、ブラウザーでアクセスすると、ちゃんと ファイルが削除されるのですが、 シェル上で実行すると、以下のようなメッセージ glob failed (child exited with status 1) at test.cgi line 5. とか出て削除ができないのです。 パーミッションも 755 とかで試したのですが、 どうしてなのでしょうか・・・うんうん煮詰まって います。

    • ベストアンサー
    • CGI
  • あるURLがファイルなのかディレクトリなのかが知りたい

    用語の使い方が不正確かもしれませんがご容赦下さい。 例えば、http://www.foobar.jp/xxx というURLがあった場合に、xxx の部分がファイルなのか、あるいはディレクトリなのか、あるいはスクリプトなのか、を知るにはどうしたらいいでしょうか? 現在、以下のようなプログラムを作成しています。 ・あるURLを指定する。 ・そのURLが指すページの内容を取得する。 ・そのページの中にあるリンクを全て取得する。 ・取得したリンクをフルパスに変換して出力する。 この際、 ・指定したURLがホスト名のみ ・指定したURLが / で終わっている ・取得したリンクがフルパス ・取得したリンクが / で始まっている ような場合は問題ないのですが、 ・指定したURLがホスト名のみでなく、かつ / で終わらず、かつ取得したURL が / ではじまらない といった場合は、どのようにフルパスを組み立てたらいいかがわかりません。 例えば、指定したURLが「http://www.foobar.jp/xxx」、取得したリンクが「yyy/zzz」のような場合、出力すべきフルパスは以下の2種類が考えられますが... http://www.foobar.jp/xxx/yyy/zzz http://www.foobar.jp/yyy/zzz 以上よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイルの""内コンマの処理

    以下のようなCSVファイルがあります。 xxx,yyy,"z,zz",XXX,"YY,Y",ZZZ,111,222 これを、 xxx,yyy,zzz,XXX,YYY,ZZZ,111,222 の様にperlで ""内のコンマを取りたいのですが、どうしたらよいでしょうか? xxx,yyy,z zz,XXX,YY Y,ZZZ,111,222 の様に""内コンマを別の文字に置き換えても可です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • シェルでファイルの最下行を削除する方法

    シェルでファイルの最下行を削除する方法 シェルで、ファイルaaa.txtの最下行を削除したいです。これを1行で実現したいです。 exには-cってオプションがあるので、ex -c '$d' aaa.txt などと試してみましたがダメでした。 ;(コロン)や&&でつなぐのは、1行ではないって事でお願いします。 >cp aaa.txt tmp && sed '$d' tmp >aaa && rm tmp #こういうのは無しって意味です。 事前にスクリプトや、それ専用のバイナリを用意しておくのも無しでお願いします。なるべく汎用的な どこのUNIXにでもあるようなコマンドで実現したいです。

  • ディレクトリ名をファイル名するバッチファイル

    ディレクトリ名を取得してその名称でフォルダを作るバッチファイルを考えています。 OSはWINDOWS XPです。 こういったディレクトリがあるとします。 111~444:名称が固定のディレクトリ bbb:名称が可変するディレクトリ mmm.bat、xxx.text:111フォルダと同じところにあるファイル 111┬222─bbb┬333─yyy.text    │        └zzz.text    │    └bbb┬333─yyy.text         └zzz.text mmm.bat xxx.text mmm.batを実行すると、111ディレクトリ以下のフォルダ名を取得し、 下記のようにフォルダを作成し、yyy.textの場所にbatファイルと同じ 所にあるxxx.textをコピーして差し替えるという動作をしたいのです。 (zzz.textは内容は違うが同じファイル名です) 444┬222─bbb┬333─xxx.text    │       └zzz.text    │    └bbb┬333─xxx.text        └zzz.text バッチコマンドで、ディレクトリ名を取得して空のフォルダを作る所までは 下記のようにできたのですが、 444┬222─bbb─333    │    └bbb─333 二つのzzz.textのコピー方法と、yyy.textの場所にxxx.textをコピーするにはbbbという可変するディレクトリを通らなければいけないのでその取得方法がわかりません。 分かる方は是非お教えください。 言葉が足りないところは補足もいたします。 よろしくお願いいたします。

  • 複数パターン文字列指定でログファイルの中身を削除

    はじめまして。 「a.log の xxx と yyy のある行を削除」 というようなshellScriptを書いています。 a.logは以下のようになっています。 a.log 111xxx111 222yyy222 333zzz333 222yyy222 444aaa444 555bbb555 111xxx111 xxx、yyyの複数パターンで行の削除はできないでしょうか。 sedで中間ファイル(ワークファイル)を2回作成すればできるのですが… なるべく中間ファイルは作成したくありません。 最終的にはa.logを下記のようにしたいです。 a.log 333zzz333 444aaa444 555bbb555 宜しくお願い致します。

  • ^Mをディレクトリにある全てのファイルから削除する方法

    ^Mにはいつも悩まされます。。 ^Mをディレクトリ内の全ファイルから 一発で削除する方法ありますでしょうか? 文字コードはEUCです。 perl -i.bak -pe 's/cM//' * とやっても^Mは消えてくれませんでした。。 LinuxかWindowsでできれば広範囲な環境で 削除できるコマンドはシェルが知りたいです。

  • シェルスクリプトで複数ファイルを交互に操作する方法

    Bシェルのスクリプトで複数のファイルを交互に操作したいと考えています。 例えば、  A.txt   A   A  B.txt   B   B という2つのファイルがあったとして、これを交互に読み取り、  C.txt   A   B   A   B というファイルを作成したいと考えています。 現在は1行ごとに別ファイルを作成し、最後にそれをマージするという変な方法をとっています。 awkやperlを使用しないで、純粋にBシェルのスクリプトだけでスマートに実現するにはどのような方法がありますでしょうか。 よろしくお願いします。