2011-11-17 13 views
11

私はサブディレクトリを圧縮して別の場所に送信したいのですが、私が持っている問題はzipコマンドを使うときです。Unixのzipサブディレクトリに親ディレクトリは含まれていません

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###unzipped produces the following 
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###I want 
/wanted1/wanted2/file.txt 

update:私が圧縮したいディレクトリには、たくさんのネストされたディレクトリがあります。したがって、-r。また、絶対パスを扱うことは素晴らしいことでしょう。古いソリューションは場所についてcdするのに使われましたが、私は本当にそれを気に入らなかっただけです。多分それが最良の(唯一の)方法です。

+0

'-r'は再帰的であることを意味します。本当にそれを使用する必要がある場合は、除外のzipオプションを読んでください。 1つのファイルだけを圧縮したい場合は、適切な親ディレクトリ(あなたの例)./Unwanted1/Unwanted2に移動してから、 'zip new.zip wanted/file.txt'を実行してください。つまり、「入力ファイル名のサブディレクトリ情報の最初のn個のレイヤを破棄する」という意味のzipオプションはありません。がんばろう。 – shellter

+0

あなたの例を編集して以来、かなりの量のゲームが変更されています。人々は通常、そのような絶対的な道を望んでいません。 'zip'の中には、より多くのパストリム/コントロールオプションがあるかもしれませんが、私はそれを疑っています。マニュアルページを読んでください。または、 'tar'に切り替えて、それと同じ長さのマニュアルページを読んでください。また、たとえ深くても、1つのファイルを追加する場合は、-rは必要ありません。 – IcarusNM

答えて

16

開始する場所にディレクトリを変更する必要があります。そうしたい場合は、「zip」することもできます。 manページのgazillionオプションを読むのが面倒な人は、私の場合のように、スクリプトの中でさえ、最初に「cd」してください。そう、

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt) 

それとも、-r使用しているので、あなたはおそらくちょうどfile.txtをよりもっと欲しい:またはあなたのシェルまたはスクリプトの作業ディレクトリに影響を与えることなく、カッコ内全体を囲むことができ

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted) 

またはIN /アウトジャンプするのpushd/POPDを使用します。

pushd Unwanted1/Unwanted2 
zip -r ~/new.zip wanted 
popd 

これは、SH/bashを/ cshを/ tcshの中で動作します。

3

最も簡単な、慣用的な方法:

(cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt) 

これで、すべて、タール、RAR、cpioは、友人のジッパーが同じことを管理するためにオプションを持っていますが、彼らはバージョンと確かにアーカイブユーティリティからのバージョンと異なる場合がありますアーカイブユーティリティ。もう一つの方法私はあなたが仕事をするために、シェルで動作するように学ぶ提案、そしてあなたが

を望む任意のアーカイブフォーマットを使用することができます。

(cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip [email protected] 
+0

親フォルダの構造を省略するために、 'zip'のフラグ/オプションを好んでいるのと同じくらい、これはもっと良い方法ではありません。 '-j'や' -D'の両方のフラグは、複雑なサブフォルダ構造では望んでいなかったものです。 – paperclip

3

まあ1つの簡単な方法は、周りのかもしれないが何をし

cd ./Unwanted1/Unwanted2 
zip -r ../../new.zip ./wanted/file.txt 

あなたの状況はわかりません。おそらくあなたはベースディレクトリから実行する必要がありますか?また、 "-r"オプションは、ディレクトリを再帰的にトラバースする場合に使用されます - 指定した例は1つのファイルを使用しています。

+0

本当に複数のディレクトリとファイルです。例はvです。シンプルな –

+0

icarusと同じように、カッコでコマンドを囲むと、実行が終了した後に現在の作業ディレクトリが崩れません。 – loosebazooka

関連する問題