• ベストアンサー

ディレクトリを削除するシェルスクリプト

Linuxにて、あるディレクトリ内の子ディレクトリの作成日が1ヶ月以上前のものを削除するシェルスクリプトを作成したく思っております。 対象のディレクトリには名前の一部に作成日(YYYYMMDD)を付与していますのでそれを利用してどうにかできないかと考えております。ただ実際にどう実現すればいいか分からず困っています。何か良い案がある方がいらっしゃればご教授願いたく思っております。 OS:REDHAT Enterprise Server4(カーネル:2.6.9-67)

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「当該ディレクトリの中にあるもの」を一緒に消していいなら ・「1ヶ月以上前に作られたもの」なら find でリストアップ ・xargs で rm に送る という手段でできる, ような気がする.

winarrow07
質問者

補足

早々の回答ありがとうございます。 頂いた方法でできそうです。 「1ヶ月以上前のもの」をリストすると、親ディレクトリ自体(これは消したくない)も引っかかりましたが、他のオプションを使うことで欲しい結果である「子ディレクトリの中で1ヶ月以上前のもの」にすることができました。そして、パイプでつないでxargs rm -rfでうまく消えました。 ファイル属性の更新日を使った削除はこれでいけると思います。ありがとうございますm(_ _)m ほかの方法として、ディレクトリ名につけたYYYYMMDDを使って、YYYYMMDDが1ヶ月以上前であれば消すということは不可能でしょうか?

その他の回答 (2)

  • astronaut
  • ベストアンサー率58% (303/516)
回答No.3

すでに回答がついているとおり、findで対応できるならそれが simple is best. ただし、ctimeは、ディレクトリの内容が変化すると変わってしまうので、どうしてもディレクトリ名によりたいという場合は、ということで、サンプルを書いてみました。 $topdir以下に存在する全てのディレクトリの名前を調べて、dateコマンドの %sオプション(1970-01-01 00:00:00 UTC からの秒数)を使って、作成日午前0時からの経過秒数を求め、31日x86400秒以上経過しているディレクトリを削除します。エラー処理とか全然やってませんのでご注意を。 #!/bin/bash topdir=hogehoge expire=$((86400*31)) SEC=`date +%s` dirlist=`find $topdir -type d` for path in $dirlist do dir=`basename $path` if echo $dir | grep -e '[0-9]\{8\}' >/dev/null 2>&1 ; then date=`echo $dir | sed 's/^.*\([0-9]\{8\}\).*$/\1/'` sec=`date +%s -d $date` age=$(($SEC-$sec)) if [ $age -gt $expire ]; then rm -rf $path fi fi done

winarrow07
質問者

お礼

>findで対応できるならそれが simple is best. そうですね。おっしゃるとおりです。やはりSimple is Best行くべきですね。頂いたコードはシェルスクリプトの勉強の参考にさせていただきたいと思います。ありがとうございました。

回答No.2

たとえばこんな感じでできませんか? find . -ctime +30 -type d -exec rm -fr {} \;

winarrow07
質問者

お礼

ありがとうございます。こちらでもできました。 {}と\;の間にスペースを入れ忘れ、 missing argument to `-exec' が出て、しばらくの間悩んでました。。

関連するQ&A

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • シェルスクリプトで困っています 2

    度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。

  • シェルスクリプトに手をだしてみたいのですが。。。

    Linuxに触れて半月ちょっとの私ですがこれまでRedHat7.3のインストール、ftpの実装、sambaの実装、カーネルの再構築をこなしてきました。 で、次なにしようかなぁと思っていたところ、シェルスクリプトというもの を発見しましたのでこれに手を出してみようかと思っています。 1.BourneShellの作成手順のようなものを詳しく説明してくれてるサイトを教えてください。自分でも探してみましたがこれより詳しくかつ優しく教えてくれてるサイト知ってる人いませんか? (Cshって下記サイトでいってるとおり手出さない方が良くて、BourneShell知っておけば十分なんですよね?)   http://www.oiden.net/Flets/bangai03/   http://warp.syns.net/10/ 2.「シェルスクリプトを使用して何をしたいのか」を当然決めないと作れるものも作れませんが、現時点で想像つくのが指定時間にファイルのバックアップをとる(指定時間なんてできんのか?)とかしか思いつかないのですが、「こんなの最初に作ればスキルアップになんじゃない。」ってゆうのないですか?出来れば答えも一緒にわかるとうれしいです。   なにぶんLinux初心者でなおかつ周りに教えてくれる人もなく、頼れるのは 教えてgooのみの悲しい状況です。 漠然とした質問で大変恐縮なのですがどなたか回答ください。

  • シェルスクリプト 自身のファイルパスを取得する方法

    基本的なことかもしれないのですが、教えて下さい。 シェルスクリプトをLinuxで作成しています。 シェルスクリプトを実行して、実行したスクリプトまでの絶対パスを取得したいのですが、方法がわかりません。 いろいろ調べて、 dirname $0 という方法で出来るような記述も見つけたのですが、$0ではスクリプト名を取得することしか出来ず、ファイルパスを取得することが出来ませんでした。 OS : Linux カーネル : 2.6 です。 他に必要な情報があれば教えて下さい。 よろしくお願いいたします。

  • シェルスクリプトでファイル削除したい

    シェルスクリプト初心者です 今回、Linuxサーバ側にある複数のファイルを削除する 必要が出てきました このため、シェルスクリプトを書いて複数(2000程度) のファイルを削除しようとして試験をしています 試験のLinuxサーバ側の/root の中にfile1,file2・・・ 等々を置いています そこに次のようなスクリプトを記載して ファイルが置かれている場所と同じ/rootに置いて実行させるのですが ************** スクリプト ******** #!/bin/sh echo "start" # # rm F1010002.JPG rm F1010003.JPG rm F1010004.JPG echo "end" ****************************** 下記のようなエラーが出ます ****************************************** start rm: cannot lstat `F1010002.JPG\r': そのようなファイルやディレクトリはありません rm: cannot lstat `F1010003.JPG\r': そのようなファイルやディレクトリはありません rm: cannot lstat `F1010004.JPG\r': そのようなファイルやディレクトリはありません end ****************************************** サーバ側にSSHで入って、 # rm F1010002.JPG とひとつひとつ打鍵していくとファイルは削除されます スクリプトの間違い等あるのでしょうか 教えていただければ幸いです なお、ファイル数2000件程度のスクリプトを記載する方法は 別のソフトを利用して作成できるので・・・その件はいいのですが・・・

  • Redhat9にあるシェルスクリプトをWinXPのアプリから実行させる方法

    サーバ:Redhat9(ファイル[smb],DB[postgres]サーバ) クライアント:WinXPorWin2000 Redhat9でDBの一括処理をシェルスクリプトで作成しました。 自動処理はcrontabなどで行っていますが、手動処理も行いたいと思います (DBだけではなく、いろいろ活用する予定です) クライアントはVC6.0で作成されたアプリが動作しています。 (要はクライアントサーバシステムです) クライアントのアプリからボタンクリックでRedhatのシェルスクリプトを実行するよい方法はありますか? 現在案として (1)Redhatでシェルスクリプトを作成する (2)Windowsでrshコマンドを使用しシェルスクリプトを実行するバッチファイルを作成する (3)クライアントのアプリからバッチファイルを実行する という方法を考えていましたが、 rshのPermission deniedの問題で先に進めません。(この件は別スレッドで質問済みです) 何か良い案をご教授頂けますでしょうか? よろしくお願いします

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • Linux起動時にシェルスクリプトを走らせるには?

    いつも参考にさせていただいてます。 私はRedHat7.0でLinuxを勉強中です。 現在、Linuxの起動時にシェルスクリプトを走らせようと思っているのですがうまくいきません。 まだ初心者で手順自体が違っているかもしれませんので、大まかで構いませんので手順を教えてください。

  • ユーザー作成/削除をするシェルスクリプト

    とある理由によってWeb上からLinuxユーザーやMySQLデータベースなどを追加できるようにしたいのですが、 PHPなどの言語からシェルスクリプトを呼び出す方法は知っています。 ユーザー作成をするシェルスクリプトは、 普通にuseraddや、userdelでよろしいのでしょうか? あとuseraddでユーザー名を入力し、パスワードを聞かれずに 一発でユーザーが作成できるオプションがあれば教えてください。 userdelやcreate databaseも同じです。

  • シェルスクリプトでFTPの実行結果を取得するには

    OS redhat linux シェル bornシェル でftpを実行するスクリプトを作っていますが、 ftpの実行結果は取得できるのでしょうか? ftp -n < ftpCom.txt 宜しくお願いします。