• ベストアンサー

windowsサーバでのディレクトリ削除方法

有料で作成していただいたPerlスクリプトについてですが、管理室でフォルダの削除ボタンを押すと「'rm' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示され、フォルダが削除できません。Linuxサーバでは正常に削除されます。作成して頂いた会社に連絡をしましたが、長期間お返事を頂けておりません。どうにかしてWindowsサーバでも正常に削除できるようにしたいと考えておりますが、私はPerlに疎いため、皆さんのお知恵をおかりしたく質問させて頂きました。著作権問題が生じますので、何処までスクリプト内容を書き込んでいいのかわかりませんが、取り敢えず以下の部分を書き込んでみます。 ------------------------------------- # ロック開始 &lock if ($lockkey); @new=(); open(IN,"$memfile") || &error("Open Error : $memfile"); while (<IN>) { ($type,$num,$name,$email,$url,$id) = split(/<>/); if ($in{'id'} eq $id) { unlink("$logdir$id\.log");#こちらは正常に削除されてます。 unlink("$logdir$id\.dat");#こちらは正常に削除されてます。 if ($type ne 'p') { use Shell qw(rm); rm("-rf","$htm_dir$us_dir/$id");#これが削除できません。 } next; } push(@new,$_); } close(IN); ------------------------------------- $htm_dirは変数宣言です。 $htm_dir = 'P:\public_html\cgi-bin/'; $us_dirは各ID($id)の入っているフォルダです。 $idはIDフォルダです。この$idフォルダの削除を試みています。 rmはLinux専用らしいので、その部分を変更するのだとは思いますが。ご存知の方がおられましたらご指導を宜しくお願い致します。

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2で自作関数といっていましたが、標準モジュールで同等の関数がありましたので紹介します。 use File::Path; rmtree("$htm_dir$us_dir/$id"); を使えば、使用しているシステムに関係なく動作すると思います。

cocolink
質問者

お礼

ご回答有難うございます。おかげさまで解決することができ、本当に助かりました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

スクリプトの変更ができないということであれば、 rm コマンドのwindows 版がフリーソフトでいくつかあると思うのでそれをインストールするのがいいかもしれません。 フリーソフトのインストールができないということであれば、 スクリプトを変更するしかないです。 OSを判別して(OSの判別には、$^O 特殊変数が使えます。) #1の言われるような rmdir パス /s /q に置き換えるとか あるいは、再帰的にフォルダとファイルを削除するような関数をPerl で自作するか、(それほど難しくはありません) だと思います。 どちらかというと、色々外部コマンドに依存するより この際自作関数を作るのがいいような気がします。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

Windows(DOS)ではrmdirです。 > 著作権問題が生じますので でしたら作者さんに直接訊きましょう。 なぜ、第三者に尋ねるのでしょうか?

cocolink
質問者

お礼

ご回答有難うございます。作成していただいた当時にもご連絡しましたが、別バグは修正して頂けましたが、この問題に関しては回答が得られず、また数週間前にも再度ご連絡いたしましたが、お返事を頂けておりません。試行錯誤していろいろ試してみましたが、自力ではどうしても解決することができませんでしたので、著作権に関係なさそうな一部分のみの投稿でしたら問題ないとの判断で質問させて頂きました。しかし著作権問題がまったく無いとも言えませんので、削除依頼を出しておきます。

関連するQ&A

  • Perlでディレクトリごと削除したい

    telnet.cgiを使って、カレントディレクトリで、 rm -rf * を行っても、なぜか(permissin 755にも関わらず)permission denyといわれうまく削除できませんでした。 そこで、perlを使って削除を試みたいのですがどのようにすれば、削除できますか? 参考になりそうなソースを見つけたのですが、ディレクトリの中にディレクトリがある構造のためうまく削除できませんでした。 どなたか、改良していただけないでしょうか? お手数ですが、宜しくお願い致します。 #!/usr/local/bin/perl $dir = "./d/"; opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; close DIR; $flag = @files; if ( $flag ) { foreach $file ( @files ) { unlink "$dir$file"; } } rmdir $dir;

    • ベストアンサー
    • CGI
  • サーバ上のロックディレクトリを削除したい

    サーバにアップしましたcgiのディレクトリ(フォルダー)を削除しようとしたのですが、 FTPから、どうしても削除出来ないディレクトリがあります。 そのディレクトリとは、下記のツリーにあります、lockディレクトリなんです。lockディレクトリ以下を全部消したいのです。 ルートディレクトリ(プロバイダは@Niftyです) ・・ │ ・・ │---cgi-bin ・・・・・ │ ・・・・・ │---joyfulディレクトリ(KENT WEBの"掲示板"です) ・・・・・・・・・ │ ・・・・・・・・・ │---lockディレクトリ ・・・・・・・・・・・・ │ ・・・・・・・・・・・・ │---joyful.lockディレクトリ ・・・・・・・・・・・・・・・・ │ ・・・・・・・・・・・・・・・・ │---名前がないディレクトリ(下にファイル何も無し) (階層をそのままUPしますと、全部左に寄ってしまいますので、 ドットを入れてあります) このlockディレクトリを削除するため、ウェブで検索したところ、下記のような削除用スクリプトを発見しました。 そこで質問なのですが、 "$delete_dir = "/home/member/ユーザーID/public_html/消したいディレクトリ名/";" ここのところは具体的にどのように書けばよいのでしょうか? そして、このスクリプトはどこに置けばよいのでしょうか? 言葉が足りなければ、補足致しますので、宜しくお願い申し上げます。 削除用スクリプトはこちらにありました。 http://oshiete1.goo.ne.jp/qa1739409.html

    • ベストアンサー
    • CGI
  • ディレクトリ内の拡張子指定ファイル移動

    自分では難解で、同じような質問がなかったため質問します。私は新米です。 ルートディレクトリ(./)内の拡張子が『.send』のファイルを全て別のディレクトリ(./back)に移動するクーロンを組もうと思っているのですが、ルートディレクトリのパーミッションが750のためか下記のスクリプトですと、copyの行及びunlinkの行でPermission deniedのエラーが出ます。 ./backディレクトリに関しては777にしています。 ルートディレクトリのパーミッションはサーバーの仕様で変えられないのですが、何か有効がありますでしょうか?どうかご教授ください。 <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/.send/",$file)) { copy("./".$file,"./back".$file); unlink("./".$file); } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • unlink 、renameが使えない理由

    Redhat linux + Perl(↓バージョン) This is perl, v5.6.1 built for i386-linux Copyright 1987-2001, Larry Wall でunlinkとrenameがうまく使えないのは何故でしょうか? mkdirやmvも使えなかったように思います。rmやmkdirなどの linuxコマンドの権限は700にいじってあります。 関係あるのでしょうか?ただ755に戻してmvをしてみましたが やっぱり使えませんでした。私のミスでなければrootで 実行してもうまく動きませんでした。使える関数使えない関数 あるのでしょうか。もしそうだとしたら、その環境使える関数の リストを列挙するスクリプトやコマンドはあるのでしょうか? よろしくお願いします

    • ベストアンサー
    • Perl
  • ファイルアップローダ+複数のディレクトリを削除するシステムについて

    以下のようなフォルダ構成で、複数のディレクトリを削除するシステムを構築しよと しましたが、1ディレクトリのみしか削除できませんでした。 20090601 - xxx1.txt yyy1.txt zzz1.txt のフォルダ20090601と、ファイルxxx1.txt,yyy1.txt,zzz1.txt のみしか削除できませんでした。理想は、すべてのディレクトリ、ファイルを削除しようと、試行錯誤 しましたが、なかなかうまくいきません。 わかる人がいたら、ご教授のほどよろしくお願いします。 ============フォルダ構成==================================== 20090601 - xxx1.txt yyy1.txt zzz1.txt 20090602 - xxx2.txt yyy2.txt zzz2.txt 20090603 - xxx3.txt yyy3.txt zzz3.txt 20090604 - xxx4.txt yyy4.txt zzz4.txt $_WK_dir_name[1] = "20090601" $_WK_dir_name[2] = "20090602" $_WK_dir_name[3] = "20090603" $_WK_dir_name[4] = "20090604" ============プログラム====================================== // ファイルアップロード処理 (省略) // ディレクトリ数のカウント処理 (省略) // ディレクトリとディレクトリの中身を削除 for ($i = 1; $i < 4; $i++) { // 削除するディレクトリパスを設定 $_dir_path = './' . $_WK_dir_name[$i] . '/'; printf("★1"); // ディレクトリ・ハンドルをオープン $res_file = opendir( $_dir_path ); printf("★2"); // ディレクトリ内のファイル名を1つずつを取得 while( $file_name = readdir( $res_file ) ){ // ファイルかどうか判定する if (is_file($_dir_path . $file_name)) { unlink($_dir_path . $file_name); } } printf("★3"); closedir( $res_file ); printf("★4"); rewinddir( $res_file ); printf("★5"); // ディレクトリの中身が空になったところで、ディレクトリを削除する。 rmdir($_WK_dir_name[$i]); printf("★6"); } ============================================================

    • ベストアンサー
    • PHP
  • 特定のフォルダー内の全てのファイルを削除するには

    お世話になります。 Perlで特定のファイルをunlinkで削除することは、したことがあるのですが、特定のフォルダ例えばCGIプログラムのあるフォルダ配下の「./temp」フォルダー内の全てのファイルを削除するプログラムは、どのように記述すればよいのですか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • フォルダが削除できない

    こんばんは。 Windowsに共有ディレクトリを作成し、専用のユーザーとパスワードも作成し、Linuxからmountしました。 (mount後の読み書きは正常にできております) あるプロジェクトのバックアップをしたいと思い、シェル作成とテストをしながら、上記の共有フォルダにファイルやディレクトリをコピーしたり削除したりしておりました。 で、突然あるディレクトリだけが削除できなくなってしまいました・・・。 (LinuxからもWindowsからも削除できません) rmdirをすると、「ディレクトリが空ではありません」と怒られます。 (ls -laで見ても空です) rm -rfでも同じメッセージで削除できません・・・。 (rmなのに???) 削除できないフォルダにファイルを作成したりは、何故かできます。 フォルダを削除した後、ハードリンクの数が「0」です・・・。 (上記エラーメッセージ表示後に確認しました) なんですかね?これ。 今後はtarしてからWindows側にコピーする予定ですので、このフォルダ (実際には、ちょっとパスが深いので、マウントポイント以下は全て) を削除してしまいたいのですが・・・。 オーナーはrootです。 chmodは効きません・・・。 (777指定しても反映されてない、まぁroot作業なので関係ないですが・・・) Linuxに詳しい方、ご教示くださいますよう、よろしくお願い致します。

  • unlinkでどうしてもファイルが削除できない!!

    お世話になります。 いろいろとネットで情報を探しているのですが、どうしても解決しません。 ローカルなapacheのサーバにファイルをアップロードし、指定のファイルを削除するプログラムを作成しています。 プログラムファイルのあるディレクトリの下に"files"というディレクトリがあり、その下に、アップロードした日付でディレクトリ(例:"200511171010")をプログラム側で作成し、その下にファイルをアップロードするものです。 編集するプログラムで、選択したファイルを削除するというものです。 サーバは、Windows2000,MySQL,Apacheです。プログラムはEUCで書かれています。 ・フォルダを作成するプログラム $uniq = $dir_y.$dir_m.$dir_d.$dir_h.$dir_i; $uploaddir = "./files/$uniq/"; //ファイルのアップロード処理 if($_FILES['file1']['name'] != ""){ mkdir("$uploaddir"); $ufile[1] = $_FILES['file1']['name']; $ufile[1] = str_replace("'","’","$ufile[1]"); $uploadfile = $uploaddir.$ufile[1]; move_uploaded_file($_FILES['file1']['tmp_name'],mb_convert_encoding($uploadfile, "SJIS", "EUC-JP")); } ・ファイルを削除する部分 $rslt = unlink("./files/$uniq/$t[$i]"); です。 エラーは、 Warning: unlink(./files/20051115195407/購入書籍.xls) [function.unlink]: No such file or directory in C:\Program Files\Apache Group\Apache2\htdocs\shuchi\edit_ok.php on line 103 です。ファイル自体はあるのですが、削除されていません。 パーミッションとかも、フォルダを作成するときとか、いろいろいじってみたのですが解決しませんでした。 何かわかれば是非、教えてください。すみませんがよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 日付名のディレクトリを世代管理したい

    linuxのコマンドについて教えてください。 あるディレクトリ内で日付のディレクトリを3世代管理しています。 今まではrmで手動削除していたのですが、他のディレクトリでも同様の作業をしたいので、 スクリプトで行おうと考えています。 ただ、ディレクトリ内には様々な名称のフォルダ・ファイルがあり、 上手く日付のディレクトリを取ってこれません。 イメージとしては日付のディクトリだけを取ってきて、ソートし古いのを削除でいけると思うのですが… 詳細は以下です。 同一ディレクトリ内に以下のフォルダがある 20150101 20150103 20150105 20150107 hoge test sample.txt などなど この中で日付のディレクトリの4番目に古いディレクトリを削除したい。 (20150101のディレクトリだけ削除するイメージです) どのようにコマンドを打てばいいか教えていただけますでしょうか? よろしくお願い致します

  • PHPのファイル削除についての質問です。

    PHPについての質問です。 現在、自社サイトで使用している画像の管理画面を作っているのですが、 PHPを使って不要になった画像を削除する部分を作成しております。 しかし、まだ何分初心者なのでわからないところもあり質問させていただきました。 削除用のPHPファイルを作成しておりますが、動作すると以下のエラーが出てしまいます。 Fatal error: Cannot redeclare deletedata() (previously declared in ・・・・・・・・・/php/delete.php:5) in ・・・・・・・・・・・/php/delete.php on line 5 組んだプログラムに問題があると思いますが、この場合どのようにすればよろしいでしょうか。 分かる方アドバイスをお願いします。 <?php $no = 1; foreach(glob('../images/slider/*.jpg') as $val){ function deletedata($dir) { if($dirhandle = opendir($dir)) { while(false !==($val = readdir($dirhandle))) { if($val != "." && $val != "..") { unlink($dir.$val); } } closedir($dirhandle); } } } ?>

    • 締切済み
    • PHP

専門家に質問してみよう