• ベストアンサー

【ZIP】unixサーバーでディレクトリを保ちZIP圧縮する場合

サーバー上でディレクトリ構造を保ったままZIP処理を行なう方法について勉強しています。 下記のような2つのファイルがサーバー上にあるとき /usr/home/xxx/html/base/dir1/file1.txt /usr/home/xxx/html/base/dir2/file2.txt 以下の処理をかけると、 zip -r /usr/home/xxx/html/data.zip /usr/home/xxx/html/base data.zip 内に「usr」を先頭にしたディレクトリ構造が生成されます。 しかしこれでは意味のない多重入れ子となり具合がよくありません。 何とか「usr」ではなく「base」が先頭になるよう指定はできないものでしょうか? 具体的にはdata.zip内に、以下が生成されてほしいわけです。 base/dir1/file1.txt base/dir2/file2.txt 方法をご存じの方、よろしくお願いいたします。 <環境> レンタルサーバー FreeBSD 6.2 操作はPHP5経由

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

exec()ではなく、 system("cd /usr/home/xxx/html;zip -r /usr/home/xxx/html/data.zip base"); ではどうですか? あるいは、exec("sh -c 'cd /usr/home/xxx/html;zip -r /usr/home/xxx/html/data.zip base'"); でも同じですが。

ikataro
質問者

お礼

できました!! なるほど、1行にまとめればいいのですか。 ありがとうございました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

え?こういうことですよ cd /usr/home/xxx/html zip -r /usr/home/xxx/html/data.zip base

ikataro
質問者

お礼

ありがとうございます。なるほど少しできてきました。 いろいろ試したところPHPの exec() 経由で実行しているから挙動が違うのではと想像しています。 まず、 1) zip -r /usr/home/xxx/html/data.zip base の2番目の引数("base"部分)はPHPファイルと同階層のディレクトリでなければ動かないようです。 2) また、cd /usr/home/xxx/html については いろいろ変えてみましたが影響はないようです。PHPから cd コマンド出すこと自体、意味がないんでしょうか。 というわけでファイル置場の制限付きですがおかげさまで /usr/home/… から始まるようなものすごい入れ子は回避できるようになりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

cd /usr/home/xxx/html/ してから相対パスでできませんか? (試してないのでわかりませんが)

ikataro
質問者

お礼

ありがとうございます。 試してみましたが変化なさそうです…

関連するQ&A

  • ディレクトリ構造の表示

    任意のディレクトリ構造を分析してその構造(ファイル名をkey)をXMLなりハッシュに吐き出すことができるモジュールなり方法を模索しています。 XMLでいうXML::Simpleみたいなものです。 参考------------------------------------------------------ 【XML分析:XML::Simple】→【ハッシュ:Data::Dumper】 【XML分析:XML::Simple】→【XMLファイル:XML::Simple】 ---------------------------------------------------------- グーグルなどで検索してみた限りでは、任意のディレクトリ内分析をしてくれてXMLなりハッシュに吐き出してくれるモジュールはなさそう。 そこでFile::Pathを使ってディレクトリ内を洗ってその構造を動的にハッシュにしたいと考えいます。しかし残念なことに予め構造がわかっている規則的なデータを動的にハッシュにすることはできるのですが、実際に分析するまでその階層すらわからない不規則なツリー状のデータ構造を動的にハッシュ化するプログラミング能力を持ち合わせていません。 そこで質問しかないということになりました。ぜひお知恵をお借りしたいと思っています。よろしくお願いいたします。 本当に簡単ですがこのような不規則なディレクトリ構造を動的にハッシュにしたいと思っています。この例ではディレクトリ構造がわかってますが、分析するまでわからないものとしてみて頂ければと思います。 test1(dir)―――――test2(dir)――――――――data1.txt(file)            |           |            ―data1.txt(file)   ―data2.txt(file)            |            ―data2.txt(file) $test1 = {       'test2' => {            'data1' =>                          {                       'path' => 'test1/data.txt',                       'parent_dir' => 'test2'                         },            'data2' =>                          {                       'path' => 'test2/data.txt',                       'parent_dir' => 'test2'                         },                 },       'data1' =>                     {                  'path' => 'test1/data.txt',                  'parent_dir' => 'test1'                    },       'data2' =>                     {                  'path' => 'test2/data.txt',                  'parent_dir' => 'test1'                    }     };

    • ベストアンサー
    • 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
  • Linuxのディレクトリへのファイル展開

    Linuxのディレクトリへのファイル展開 クロスコンパイルなどで、debパッケージのツリー構造のままコピーしたいんです。 例えば、展開したdebパッケージの~/temp/usr/bin/xxxを~/arm/rom/usr/bin/xxxに コピーする。あるいは、ディレクトリが無ければ、ディレクトリごとコピーする なんてことが必要になりますが、これを自動処理することはできないでしょうか? あるいは、自動処理のMakefileを自動で作るとか

  • tcsh 別サーバのディレクトリ名取得

    いつもお世話になってます。 標題についてご教授願えないでしょうか 先日同一サーバ内でディレクトリ名一覧を取得する事はできました。 しかし、他サーバのディレクトリ名を取得するにはsftp等で 繋いで取得するしか方法はないのでしょうか 現サーバ:test@hoge1 他サーバ test@hoge2 現サーバから他サーバの/usr/home/htdocs/配下のディレクトリ名を取得 find test@hoge2:/usr/home/htdocs/* とやっても 「そのようなファイルやディレクトリはありません」 と言われてしまいます。 よろしくおねがいします

  • Archive::Zipで指定ディレクトリに解凍したいのですが・・・

    お世話になっております。 Archive::Zipで以下のようなソースで解凍を行っています。 $file = "/data/31000/upload/MMEISYO.zip"; # オブジェクトの生成 my $zip = Archive::Zip->new(); #ファイルの読み込みに失敗したら強制終了 die 'Archive File Read Error' unless $zip->read($file) == AZ_OK; #ファイルの一覧を取得 @members = $zip->members(); foreach (@members) {   #ファイル名はfileNameにて取得できます。   my $name = $_->fileName();   #ファイルをアーカイブから取り出す。   $zip->extractMemberWithoutPaths($name); } しかしこれだと、CGIのあるディレクトリに解凍してしまいます。 違うディレクトリに解凍したい場合には、どのようにしたら よろしいのでしょうか? どなたかお助け願います。 お願いします。

    • ベストアンサー
    • Perl
  • パスの設定

    現在、 dirディレクトリ以下にユーザが入力した値のディレクトリを作り、そこに xxx.txt といったものを作成するプログラムをしています。 $dir = "./dir/" .$_POST["user_id"]; まではうまく動いています。 $file = $dir/xxx.txt がうまくいきません。 よろしくお願いします。

    • 締切済み
    • PHP
  • tar.gz圧縮のファイルサイズについて

    レンタルサーバCPIにて、 公開ディレクトのWebデータを圧縮してバックアップをとりたいと思い、 tar.gz圧縮のスクリプトを書いてcronで自動実行(1日1回)させています。 生成されたデータをみると、 公開ディレクトリのファイル数やフォルダ数は同じにも関わらず、 tar.gzの圧縮ファイルのファイルサイズが毎回異なっているのですがこれはtar.gzの仕様でしょうか? コマンドは下記となります。 tar -czf /usr/home/*****/webdata.tar.gz /usr/home/*****/html/; お分かりの方、ご教示頂ければと思います。 どうぞよろしくお願いいたします。

  • フォルダ階層のあるzipファイルで全ファイルを抽出

    こんにちは 日々のちょっとした作業が煩わしくて、自動化できないかと思い質問します。 仕事で毎日、何度となく zip ファイルを受け取ります。このzipファイルは次のような階層になっています。 パターン1: base.zip -folder1 --folder2 ---folder3 ----workfile.txt パターン2: base.zip -folder1 --folder2 ---folder3 ----folderA -----workfileA.txt ----folderB -----workfileB.txt ----folderC -----workfileC.txt 必要なのは、パターン1の場合は workfile.txt、パターン2の場合は workfileA|B|C.txt です。毎日このフォルダ階層をたどって、最後のファイルをコピーしてまた元のディレクトリに戻ってペーストしています。パターン2の場合も、最後のA|B|Cファイルを元の同じ1つのディレクトリに並べてコピーしています(foldrA|B|Cに分かれていても関係ない、ということです)。 こうした作業を自動化する方法はないでしょうか。 7-zip アプリケーションは導入しています。 おそらく、考え方としては、zip 内にある「フォルダ以外」=「ファイル」を、そのzipファイルと同じディレクトリにすべて展開する、というスクリプトになると思います。 7-zip あたりのコマンドラインをbatファイルでこねくり回すとできるのか、zip をフォルダとして展開した後、batかwshスクリプトでぐるぐる回すのか、どうしたらよいかわかりません。 どなたかお知恵を貸してください。よろしくお願いします。

  • サーバへのインストール

    PHPでPDF生成をしたいため、 「FPDF」「japanese.zip」をインストールのしたいのですが できませんでした。 /usr/local/lib/ の中に「pdf」というディレクトリを作り ファイルをftpでアップしたら以下のエラーがでました。 ================================== FFTPエラー 553/usr/local/lib/pdf/ex.php: No such file or directory. ================================== これってこのディレクトリには アップする権限がないということですよね。 アップする方法ってありますか?

    • 締切済み
    • PHP
  • unixのfindコマンド

    unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。