パスワードを忘れた? アカウント作成
13531736 journal
日記

tuneoの日記: シェル力を高める:こんなパイセンにつける薬はありませんか 18

日記 by tuneo

だってパイセンときたら勤続10年のベテランなのに「とあるディレクトリ以下を再帰的に検索し、ファイルの最終更新日が30日以前であれば削除する」スクリプトを書くのに1時間かけてるんです。なんつー時間の無駄。

しかも自分でman findしてひねり出したから1時間かかりました、とかじゃなくてGoogle先生にお伺いを立ててヒットしたブログの丸写し。その結果、検索条件が見事に「作成日が30日以前」になってやがったし、ディレクトリも削除しようとしてたし、ファイル名に空白が入っていたらどうなるかの考慮はゼロ。あと俺がman findしながら書き散らしていたら、ド厚かましいことに「削除するファイルのログが取れるといい」とか言い出しやがりました。自分じゃできないくせに他人に要求するのはいっちょ前なんだよなぁ。

というわけで帰宅前に15分(実際にはテストに時間を食われていたんだけど)でひねくりだしたのがこんなの。

#!/bin/sh
DIR=/directory
LOG=logfile
find "$DIR" -type f -daystart -mtime +30 -print0 | tee "$LOG" | xargs -0 rm -f

……そんなクソ仕事でも得られるものはゼロじゃない。別に得たくはなかったが。

・テスト用のダミーファイルをでっち上げるときtouch -t MMDDhhmm fileとか書くとタイムスタンプ(最終更新日)を指定して空のファイルを作成することができる。便利。
・ディレクトリのタイムスタンプもtouch -tでいじれる。ただしこの場合はtouchでディレクトリを作るわけにはいかないので事前にmkdirが必要。

この議論は、tuneo (2938)によって テキとトモのテキ禁止として作成されたが、今となっては 新たにコメントを付けることはできません。
  • by uxi (5376) on 2018年02月21日 12時10分 (#3365026)

    tee に -a オプション付けないと上書されるよ

    タイムスタンプも入ってないといつのログか分からないので、むしろファイル名を以下のようにして、実行毎に別ファイルにするべきじゃないかと思う。
    LOG=logfile.`date +%Y%m%d%H%M%S`

    --
    uxi
  • タイトルはスクリプトキディ気取りで。
    プレーンファイルのみとかログとかはばっさり無視する前提で。
    ええと、 xargs でファイル名に空白文字を含んだをパイプで引き渡すと
    意図しない挙動になる
    具体的には
    1. 誤った解釈でブランク・キャラ直前でぶった切られた名前で処理。
    2. その際に本来ありえなかった標準エラー出力がべろべろ吐き出される。
    は避けるべきではないかと。
    (エラー出力が処理と同期して得られる保証がないので見て切り分けがつらいはず)

  • 内々ではそんなファイルは作らない前提で仕事してたけど。
    SAMBAとかでWindowsから日本語ファイル名や空白入りファイル名をジャカスカほうり込んでくる人たちが現れて、文字化けでファイルハンドリングできなくて異動も削除もできないとかで阿鼻叫喚になったこともあったっけ。

    find の -print0 と xargs の -0 は知らなかった・・・

    うちでやってる仕事例(粗野)
    % find /hoge/fuga/ -type f -mtime +30 > list0; cat list0 | xargs -i{} \rm -f {} \;

typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...