• ベストアンサー

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

Cシェルプログラムで、あるディレクトリ上にあるファイルサイズが0バイトのものを削除する処理を作りたいのです。どのようなコマンドを使って組んだらよいのでしょうか?

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

#/usr/bin/csh foreach f (*) if (-f $f) if (-z $f) rm $f endif endif end 動作確認していないので、実行前に rm $f の部分を echo $f にして、目的のファイルが処理されるか確認してから実行して下さい。 間違って必要なファイルを削除してしまっても責任は取れないので、実行は自己責任で。

momo63
質問者

お礼

ご回答ありがとうございました。 質問内容と変わってしまって申し訳ないのですが、Bシェルの場合は「foreach 」は使えないのですか?

その他の回答 (1)

  • 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