web-dev-qa-db-ja.com

アーカイブを作成するときにSnowLeopardでtar-Cを使用するにはどうすればよいですか?

マニュアルページには次のように記載されています

-C directory
      In c and r mode, this changes the directory before adding the following files.

ただし、tarは指定したディレクトリに変更されず、代わりにレポートします

tar: <folder name>: Cannot stat: No such file or directory

ディレクトリ内のすべてのフォルダに対して、でtarコマンドを実行します。

私は本当に次のようなことをしなければなりませんか

cd <folder> && tar ... && cd -

または、この作業を行う方法はありますか?

4
ssc

この質問で推測するような-Cオプションは使用できないと思います。

セクション 6.10.1 Changing the Working Directory GNU tarのマニュアルでは、次のような-Cオプションについて説明しています。

コマンドラインまたは '--files-from'( '-T')を使用して指定されたファイルのいずれかで、ファイル名のリストの途中で作業ディレクトリを変更するには、 '-directory'( '-C ')。これにより、リスト内のその時点以降、作業ディレクトリが指定されたディレクトリに変更されます。

‘--directory=directory’
‘-C directory’

コマンドラインの途中で作業ディレクトリを変更します。

例えば、

$ tar -c -f jams.tar grape Prune -C food cherry

現在のディレクトリのファイル「grape」と「Prune」をアーカイブ「jams.tar」に配置し、続いてディレクトリ「food」のファイル「cherry」を配置します。このオプションは、同じアーカイブに保存する、大きく離れたファイルが複数ある場合に特に便利です。

ファイル「cherry」は、「food/cherry」ではなく「cherry」という正確な名前でアーカイブに記録されていることに注意してください。したがって、アーカイブには、すべて同じディレクトリからのものであるように見える3つのファイルが含まれます。アーカイブがプレーンな「tar--extract」で抽出された場合、3つのファイルすべてが現在のディレクトリに書き込まれます。

マニュアルページにはさらにいくつかの例があります...


更新:
私は通常、異なるパスからのファイルを1つのtarボールに混同しません。
しかし、それがあなたの望むものであるならば、できることが2つあります。

  1. 一緒にパックしたいディレクトリ/ファイルのリストで-Tオプションを使用します。
    これにより、すべてのものが追加のパスプレフィックスとともに収集されます。
  2. 'リンクイメージ'ディレクトリで-hオプションを使用します
    (新しい空のディレクトリの下に目的のファイルとディレクトリへのリンクを作成するスクリプトを使用してそれらの1つを作成します)
    このようなディレクトリで使用される-hオプションは、そのディレクトリの下のファイルレイアウトを表す単一のtarボールを作成します。
2
nik

個人的には、サブシェルを使用してtarを「位置」にすることを好みます。 -Cオプションを学んだことがないので、どのように機能するのかわかりません。

私のCWDが/ path/aであり、先頭の/ path/bなしで/ path/b/fooのtarballを作成したいとします。 =:

user@Host:/path/a$ ( cd /path/b && tar czf ~/tarball.tgz foo )
user@Host:/path/a$

結果のtarballには、ディレクトリfoo /とそのすべての内容が含まれますが、先頭の/ path/bは含まれません。サブシェルはcdを実行し、cdが成功した場合はtarを実行し、同じCWDで元のシェルに戻ります。

1
quack quixote

hennoがコメントの1つで述べているように、tar-Cはワイルドカードでは機能しません。

* tarに渡される前に、現在のディレクトリに基づいてシェルによって展開されます

したがって、次のようなことをしようとしている場合:

tar -cvzf myfile.tgz -C somepath *

それは動作しません。私が知る限り、quack quixoteが示唆するように、最初にディレクトリを変更する必要があります。

1
Code Commander