• ベストアンサー

Perl:あるファイル名が指定のリスト(テキストファイル)になければ、そのファイルを消去するというのを作りたいのですが。

RHL9.0を使ってます。/var/spool/mail/以下に次のようなファイルがあったとします。 taro hanako daisuke yukie また、/home/admin/user-name.txtというファイルには次のように書かれています。 taro hanako … このとき、perlを用いて/var/spool/mailディレクトリからuser-name.txtに名前のない人のファイルを消去するというスクリプトを作りたいのですが。おそらくif 文を使うと思うのですがどうすればよいでしょう。$userという変数にuser-name.txtの一つ一つを代入してWhile文でまわすことはできてます。後は「$userという名前のファイルが/var/spool/mail以下になかったらsystem("rm /var/spool/mail/$user");を実行する。」とするだけです。 ちなみに、userdelを-rコマンドをつけずに消去された人たちのものが実際存在する人たちのものと混在しているため消したいと言うのが動機です。

  • daipot
  • お礼率74% (185/247)

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

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

私が同じことをするなら,こんな感じでしょうか. お題目:存在しないユーザーのmailスプールを削除したい. #!/bin/bash for file in /var/spool/mail/*; do user=`basename $file` if ! grep $user /etc/passwd ; then rm -f $file fi done

daipot
質問者

お礼

ありがとうございます。試してみましたところ、ばっちり目的が果たせました。simple is bestなのでこっちを今後も使わせていただきます。

その他の回答 (1)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

私もshの方が向いてると思いますが、一応Perl版も書いてみます。 $dir = '/var/spool/mail/'; open (IN,'/home/admin/user-name.txt'); $in{$_}++; while <IN>; close (IN); ($in{$_} || unlink $dir.$_) while (glob $dir.'*'); #動くかどうかテストしてないのです。

daipot
質問者

お礼

ありがとうございます。この件に関してはシェルでやることにしましたが、perlの方は別の目的で応用が利きそうです。

関連するQ&A

  • 受信した各メールに異なる文字列を記入して自動でメール返信したいのですが。

    RHL8.0を使用しています。次のようなことは可能でしょうか? 1.アカウント名taroからメールが来る。 2.サーバーはtaroが自分の所のユーザかどうか判定 3.自分の所のユーザーなら4へ、違うなら何もしない。 4.taro宛に「あなたのグループはjapan-A-5です」というメールを返信する。 そして、別のユーザーhanakoから来たメールには4.で「あなたのグループはUSA-B-1です」というふうにします。 これを自動で行いたいのですがアドバイスいただけないでしょうか。

  • リストの単語がテキストファイルで何回出てくるか

    「人の苗字+改行」がたくさん入力されているname.txtと 「苗字が登場する会話文」がたくさん入力されているconv.txtの 二つのファイルがあります。 【name.txt】 鈴木 田中 佐藤 ・・・ 【conv.txt】 昨日の山田さんの話によれば、明日は佐藤さんが担当だそうだ。 京都の中山君が来たときに荷物を届けてほしい。 ・・・ これらname.txtのそれぞれが、conv.txt全体で何回出てきたかを求めるprelのプログラムを作りたいのですが、どのようにしたら良いでしょうか。 アウトプットは 鈴木 256 田中 982 佐藤 157 ・・・ となるようにしたいと思っています。 皆さまのお知恵をお貸しくださいませ。

  • Windows で ワイルドカード的検索

    Windouw Vista を使っています。 たとえば、あるフォルダー内に abc_taro_2233.txt abc_jiro_5543.txt abc_hanako_6332.txt def_taro_5566.txt ghi_jiro_4455.txt ghi_hanako_2211.txt ppp_taro_6666.txt というファイルがある時、ファイル名の中に、taro という文字列を含むファイルだけを 表示する方法はありますか? よろしくお願いします。

  • delコマンドでデスクトップ上のファイルを消去

    del コマンドで、デスクトップ上のファイルを絶対パス指定で消去したいのですが、できません。 例: del C:\Documents and Settings\user\デスクトップ\samplefile.txt    “デスクトップ上のファイルsamplefile.txtを消去” 上記を打つと“指定されたパスが見つかりません。”と返答があり消去できません。 何かお気付きの点がありましたら教えてください。

  • postfix どういう場合に/var/spool/postfix/deferredに未送信メールがたまるのでしょうか。

    RHL9.0,postfixを使用しています。/etc/postfix/aliasesをつかってメーリングリストによるメール転送を行っています。しかし、添付ファイル付きのメールをこのメーリングリスト宛に送ると/var/spool/postfix/deferredディレクトリに同じメールがのこり、1時間ごとに同じメールの送信が繰り返されます。また、一部の人にはこのメールが届きません。ログを見ても何か失敗したと言うような記述がみあたりません。

  • データ代入方法について

    以下のデータ内容の","と","の間にデータがない時は、"-"を代入する方法を教えてください。 (できれば、Solarisの標準コマンドで。) <data> user1,user1@mail.co.jp,taro,123-456,太郎, user2,,hanako,,花子, user3,,,一郎, <data変換後> user1,user1@mail.co.jp,taro,123-456,太郎, user2,-,hanako,-,花子, user3,-,-,-,一郎,

  • Postfix+Dovecotで、Maildir形式と、/var/sp

    Postfix+Dovecotで、Maildir形式と、/var/spool/mail/ 方式が混在してしまう Fedora13 にPostfix+Dovecotをインストールして、LAN内のメール交換に使っています。 ところが、ユーザーによって、Mozilla Thunderbird でメールが取れない現象が発生し、調べたところ、取れないユーザーは、/var/spool/mail/ のユーザー名のファイルが更新されていました。 メールが取れるユーザーは、/home/ユーザー名/Maildir/new/ にファイルが追加され、/var/spool/mail/ は日時が新しくなっていません。 という事は、Maildir形式と、/var/spool/mail/ 方式が混在している事になってしまいます。 /etc/postfix/main.cf には、 home_mailbox = Maildir/ を設定してありますし、 /etc/dovecot.conf にも mail_location = maildir:~/Maildir が設定してあります。 Postfix と、Dovecot のバージョンは、 /usr/sbin/postconf | grep mail_version mail_version = 2.7.0 $ rpm -qa | grep dovecot dovecot-1.2.14-1.fc13.i686 となります。 方式が混在するような事があるのか、また、Maildir形式に統一することは可能かどうか、ご存知の方、ご教授ください。

  • Perlのファイル操作の置換について

    Perlを利用し、ファイル内の置換操作を行いたいと思います。Perlに関して全く無知なので誰か教えてください。 変換したい内容を下に記載します。 (1)html:button value="aaa" name="bbb" c:button property="${aaa.bbb}"                      ↓↓  (2)html:button value="aaa" name="bbb" c:button property="${aaa.bbb}" 上記の変換ではvalueとnameがpropertyになる (3)html:button value="xxx" var="yyy"        ↓↓ (4)c:button prop="xxx" id="yyy" (3)に関してはvalueとvarの間に何か他の処理が入ってもvalueとvarだけを特定し、変換できるScript文にしたいです。 言葉足らずだったらすみません。誰か教えて下さい。

    • ベストアンサー
    • Perl
  • C#にてテキストファイル読み込み時のファイル指定

    C#でテキストファイルの読み込みがうまくいかず困っています。 他のPCの共有フォルダにアクセスしたいのですが //読み込むテキストファイル string textFile = @"192.168.0.**\test\a1.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); ネットで検索した文に従ってやっていますが、 System.IO.DirectoryNotFoundException: 'パス 'C:\Users\***\source\repos\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\192.168.0.**\test\a1.txt' の一部が見つかりませんでした。 と、ファイルがあるディレクトリが追加されています。 どこを設定すれば無視できるようになりますか? Visual Studio2017を使用しています。 会社のPCでは問題なく指定できたのですが 自分のPCだと上記のようになります。 ネットで文を検索しながら作っている素人です。 お手柔らかにお願い致します。

  • aliasesファイルを検索したいのです

    よろしくお願いします 下記のようなファイルがあります soumu:taro,jiro.hanako haken:hanako syain:taro,jiro hanakoさんが「soumu:」と「haken:」に含まれているか確認したいときは egrep '(soumu:|kaken:)' とやっているのですが(あまりいい方法ではない) その逆、「soumu:」と「syain:」両方に含まれている人は どうやれば確認できるのでしょうか? うまい方法がみつかりません お知恵をお貸しください