• 締切済み

シェルスクリプトについて教えてください

以下のようなフォルダ構成があります。 /var/tmp/組織コード/log このlogディレクトリ配下に0byteのファイルがたくさんあり、それを全て定期的に削除したいと思っています。 また、同ディレクトリにはそれ以外のファイルやフォルダも入っていて、それらは絶対に削除してはいけないものです。 以下のようなコマンドを考えたのですが、なにか懸念される点はあるでしょうか? find /var/tmp/*/log -size 0c -exec rm {} \; いろいろ調べたのですが、Linux系は初心者のため、これで妥当かどうか不安なのです。 環境はSolaris11で、bashです。 「組織コード」の部分を固定値にしてコード数分コマンドを書けば確実だとは思いますが、組織コードが増えたり変わるたびにシェルにもメンテが必要になるので、イマイチだと思っています。 詳しい方、ぜひアドバイスしていただけないでしょうか。 よろしくお願いします。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

#3の方へ rm -f `find /var/tmp/*/log -size 0c` だと書かれているようにエラーになることありますが質問に書かれている find /var/tmp/*/log -size 0c -exec rm {} \; は一致するファイルが多数あってもエラーにはなりませんよ。 まとめてrmではなくて1つづつrmで削除ですから。

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

-type f と -?time 付けた方が少しは気休めかな。日数は適当。今さっき open() したばかりのファイル消さなければいい。ファイル名に規則性があるなら -name find /var/tmp/*/log -size 0c -type f -mtime +2 -atime +2 -exec rm -f '{}' + /var/tmp が不適切というのは同感。絶対というからには /var/log や専用ディレクトリに残すべきでしょう。 あと Solaris は Linux 系じゃないので、GNU 拡張受けつけないコマンドもあるので注意。単純にどっかのサイトから Linux コマンド引っぱってくると、エラーしたりオプションの挙動が違うことはある。

回答No.3

基本的にそれで良いと思いますが、私はそうしません。 rm コマンドの後に消すファイルを書きますが、その数には何個までか知りませんが上限があります。 上限超えると Argument list too long とエラー吐きます。 なので find の条件に合致したファイルが多数あるとそのやり方ではコケます。 それを避けるために xargs  を使います。 find /var/tmp/*/log -size 0c |xargs -i rm -f '{}' であってるかな??記憶で書いたので、正しい使い方は調べてくださいw

  • ballville
  • ベストアンサー率47% (233/487)
回答No.2

/var/tmpの下に組織コードしかないのであればそのスクリプトでもいいのですが、/var/tmpはいろんなシステムが使っていますのでOS上の重要なプロセスが使っている可能性があり、怖い気がします。実際、手元のLinuxで調べたところ、6つのフォルダがありました。solarisでどうなのかは分かりませんが。 長さが0だからどんなものでも消していいかというと、そうは言い切れません。ロックファイル(0バイトであることが多い)だったりするとログが吹っ飛ぶなど思わぬ副作用もありそうです。 >組織コードが増えたり変わるたびにシェルにもメンテが必要になるので とおっしゃっていますが、シェルに書き込むのではなく組織コードを記したファイルを別途用意してシェルスクリプトから読み込むような仕様にしたらいいのではないでしょうか。組織コード表ならほかの業務でも使うでしょうから。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

ファイル名に空白が含まれないという普通の前提の下ではそれでいいです。 質問内容とは関係ないですが、消してはいけないファイルを /var/tmp の下に置くのは間違っています。まあ、勝手に消えたりはしませんが。

関連するQ&A