• ベストアンサー

Cシェルプログラムで、あるディレクトリ上にあるファイルサイズが0バイトのものを削除する

nightowlの回答

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

こんにちは。横入り失礼しますね。 Bシェルの場合は「foreach」の代わりに「for」を使います。 下の方のスクリプトをBシェルで書き換えると以下のようになります。 for f in *; do # 一行にまとめました。csh なら ( -f $f && -z $f ) になります if [ -f $f -a ! -s $f ]; then rm $f fi # if の終わり done [ は組み込みまたは外部コマンドの「test」と同じです。 ファイルテスト演算子の話ですが、Cシェルの 「-z」(ファイルサイズ0のファイルで真を返す)はBシェルにはありませんので、 「-s」(サイズが0より大きいファイルで真になる)演算子を否定(!)して用います。 (Bシェルにも「-z」はありますが、後続の文字列の長さが0の時真になるものです) 下の方が「-f」をつけているのはディレクトリのときはスキップするためでしょう。 chie65536 さんの echo を使ったテクニックは私もよくやります。 危険なコマンドの前に echo を置いて、生成されたコマンド列が 望み通りになっているかチェックしますね。 Turbolinux 8 の tcsh ではうまくいかなかったのですが、 bash では複数行もヒストリに入りますので、最後に ^echo^ で余分な echo を取り除いて発進!です。 ・C shell については http://hp.vector.co.jp/authors/VA012953/unix/cs_frame.html ・Bourne shell の強化版 bash のマニュアル http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

参考URL:
http://homepage2.nifty.com/tashikatsu/script/shell/shell-begginer.html
momo63
質問者

お礼

回答ありがとうございました。 上手く行きました。 ありがとうございました。

関連するQ&A

  • 【シェル】日付が最も古くサイズが小さいファイル削除

    ディレクトリ内のファイルで、日付が最も古い&(且つ)サイズが小さいものを削除するシェルを作成しようと考えています。 当初の以下のような考えをしていましたが、うまくいかないので質問しました・・・ ls -lStr(カレントディレクトリで日付が古くサイズが小さい順のつもり・・・) 上記のコマンド実行にて、 合計 100 -rwxr-xr-x 1 root root 333 2月 22 2009 java.log と表示されるのを利用し、上から2行目のファイル名を取得するためawkして『java.log』というファイル名をprintfで表示させ変数か何かに格納し、rmコマンドで削除という流れを考えていました。 よくよく考えると ・ls -lStr は本当に日付が古くサイズが小さいものでソートされているのか ・lsコマンドで表示した『2行目』という指定でファイル名の取得できるのか がよくわからなくなってしまいました。 上記の考え方よりこっちのほうが良い!やアドバイスがあれば非常に嬉しいです。 よろしくお願いしますm(__)m

  • シェルスクリプトで古いファイルの自動削除をするには?

    UNIXで以下の仕様を持つシェルスクリプトを作成しようと していますが、どうもうまくいきません。 どなたか、いい知恵を貸していただけないでしょうか? 目的: 特定のディレクトリ内にあるファイルについて、 システム日付より3日前のタイムスタンプを持つファイルを 削除する。 留意点: ・削除対象のファイルは複数存在する場合がある。 ・ファイルサイズは1件あたり 0byte-数百Mbyte となる  可能性がある。 ・ファイル名は不定。 ・スクリプトはBシェルまたはCシェルとする。 参考: ・現在使用しているOSについて  ls -l でのタイムスタンプにおける出力形式は以下のとおり  (デフォルト値?)  ・ 9月 28日 2000年    または   10月 24日 10時45分 知っている限りのコマンドを使っていろいろやってみたんですが、 結局ダメでした。 よろしくお願いします。

  • Solarisで0byteのファイルのみ削除したい

    Solaris11.3環境です。 以下のような構成のディレクトリがあるとします。 ---------------------------------------------- /var/tmp/KOTEI/END/ /var/tmp/組織コード/END/ ---------------------------------------------- この配下にシステムでファイルが大量に作成されるのですが、その中には0byteのファイルも含まれます。 この0byteファイルが1ヶ月で10万個近く溜まってしまうので、シェルで自動削除しようと考えています。 ファイル名に関わらず、0byteファイルは全て削除します。 以下のようなコマンドを考えたのですが、問題ないかご意見いただけないでしょうか? ---------------------------------------------- find /var/tmp/KOTEI/END -size 0c -exec rm {} \; find /var/tmp/*/END -size 0c -exec rm {} \; ---------------------------------------------- 一番怖いのは、0byteでない、データが含まれているファイルも誤って削除してしまうことです。 また、組織は変更になる可能性があるため、"*"にすることで対応できているか不安です。 是非アドバイスの程、よろしくお願い致します。

  • Kシェルでファイル削除処理

    kシェルで、ファイルを1行ずつ読み込み、記述されたファイルを削除する処理を作成したいのですが、ワイルドカード指定にも対応したいです。最初はrm -r で実施しようとしたのですが、これだとディレクトリも削除されてしまうので使えませんでした。rm -fでやった場合も削除に失敗した場合のエラーハンドリングが難しく困っています・・・。 何か良い方法はないでしょうか? lsコマンドの出力結果を再度読み込み、ファイルだったら消すという方法ぐらいしか思い浮かばず・・・。

  • 「*.txt」以外の全てのディレクトリ・ファイルを削除したい(Bシェルにて)

    rm -rコマンドを使用して、「*.txt」以外の全てのディレクトリ・ファイルを削除したいのですが、正規表現の使い方が分かりません(それ以外を対象にするという方法が分かりません)。 またできれば、「*.txt」以外のディレクトリ・ファイルが存在しなくてもリターンコードは0が返ってきてほしいです。 どのようにすれば良いのでしょうか? 環境は、SolarisのBシェルです。

  • 削除できないディレクトリー

    copy/moveやRenameは出来るのに削除できないディレクトリー***(中身はMP3,jpeg)が出来てしまいました。 0バイトのファイルでも無いし、ディレクトリー内のMP3は再生可能です。  (jpegもviewerで普通に開ける) ゴミ箱に移動させようとすると   この項目が見つかりませんでした。   次の場所にはありません。この項目の場所を確認してから再実行してください: コマンドプロンプト(del)も   ***が見つかりませんでした。 --------------- 検索すると、下記があり http://mymem.seesaa.net/article/430285102.html RDコマンドを試すと問題なく削除できた。 削除されたが考えてみると、私のDOSの知識では  ディレクトリー***の中にはサブディレクトリーがありサイズもゼロでは無いので  エラーが出てもおかしくないハズですが、すんなり削除できました。 これって正常なんでしょうか?  RDコマンドの仕様が変更されたとか?  正常でないファイル(ディレクトリー)なので考えるだけ無駄ですか?  今までこんな事は無かったのですが、win_10以降に発生している事項(バグ?)ですか? 意見あったらお聞かせください。

  • Linuxのディレクトリエントリのサイズについて

    開発したアプリケーションで、あるディレクトリにファイルを作成し、 処理が終わったらそのディレクトリ中に作成したファイルを削除する という処理を行っています。 処理を行っている最中に「No such File or Directory」というエラーが 出ましたが、次の処理では問題なくファイルの作成、削除の処理が うまく行われていました。 作業用に使っているディレクトリ名を仮に「PDF」という名前とすると、 lsコマンドで見てみると、PDFディレクトリのサイズが、1507328 となっていました。 (ディレクトリのサイズは、4092のことが多いと考えます。) 「ディレクトリエントリ」というものがあって、たとえディレクトリ内のファイルを 消去したとしても、ディレクトリ内にファイルを作成した場合は、 ディレクトリのサイズは大きくなるということまでは理解できたのですが、 なぜ、「No such File or Directory」が出てしまったのかを調べたいです。 たとえば (1)Linux(32bit)では、ディレクトリエントリのサイズに上限がある (2)Linux(32bit)では、ディレクトリエントリのサイズが大きいと、さらにディレクトリの  サイズを拡張する場合は時間がかかる場合がある などのことがあるなど、ご存知の方はいらっしゃらないでしょうか。 Linuxは、Redhat 5.7(32bit)を使っています。 憶測としては、PDFディレクトリ下にファイルを作成した際に、ディレクトリエントリの サイズを拡張しようとして、少し時間がかかり、そのためにファイルが作成されずに アプリケーション側で作成したファイルを参照しようとした際にファイルを見つける ことができずに「No such File or Directory」とOSが返してきたのではないかと 考えています。 どうぞ、識者の方、ご教示いただければ幸甚です。 よろしくお願いいたします。

  • コマンドシェルで古いファイルの削除

     コマンドシェルで一週間前のファイルを  対象に削除するというのを作りたいのですが  ご教授ください

  • ディレクトリ下のファイルとサブディレクトリを全削除

    バッチファイル作成の際、分からないことがあるのですが。 タイトルの通り、ディレクトリ下のファイルとサブディレクトリを全削除したいのですが、そのディレクトリ自体は残したいのです。 例えば "Temp"以下の全ファイルとサブディレクトリを削除したい場合 del "Temp" /s とするとサブディレクトリは残ってしまい、 rd "Temp" /s とすると"Temp"自体削除されてしまいます。 この場合、一度rdコマンドで削除した上でmdなどで新たにディレクトリを作成してやるしかないのでしょうか?

  • サブディレクトリのファイルをサイズ指定で削除したい

     できれば新たにソフトをインストールしたくないので、コマンドプロンプトで解決したいです。 ●環境:私はwindowsXPを使用しております。 ●経緯:webページを保存したのですが、リンク切のため実際は画像ではないけれど拡張子がjpgのファイルやレイアウトを整える為の小さな画像がたくさん保存されてしまいました。このような画像ファイルとして扱われる小さなファイルは、画像ビューアでスライドショーするときに邪魔なので削除したいと考えております。webページごとに別々のフォルダに保存されているので、コマンド プロンプトで一括削除できないかと考えております。 ●試したこと:検索した結果、コマンドプロンプトでカレントディレクトリの一定サイズ未満のファイルを削除する方法を見つけたので、サブディレクトリのファイルも削除するようにできないかと『 /s 』を付けたりしていじってみましたが、勉強不足だったので無理でした。このとき次のwebページを参考にしました。http://www.fpcu.jp/dosvcmd/bbs/log/delerase/4-1050.html