web-dev-qa-db-ja.com

ファイルをコピーせずに別のディレクトリからtarファイル

これは、ここの専門家にとって非常に簡単なはずです。

6GBのユーザーディスククォータを持つLinuxアカウントを持っています。 /optにはいくつかのデータフォルダーがあり、圧縮すると1 GBになると約3 GBのデータが含まれます。 data-folder内にいくつかのシンボリックリンクがあります。通常、仕事のバックアップを取るために、私は次のことをしていました。

cp -rvfL /opt/data-folder ~/
cd ~/
tar -zcvf data-folder.tar.gz data-folder
rm -rvf data-folder

これで、ユーザーのディスククォータで既に2.5 GBを消費しています。ファイルを自宅にコピーするのに十分なスペースがありますが、再度tarすることはできません。

パイプを使用するなどして、単一のコマンドでフォルダーをtarしてコピーする方法はありますか?.

追伸/optへの読み取りアクセス権しか持っていないため、/optでtarすることはできません。

10
Kamath

Tarに必要なファイルが存在する場所から離れてtarファイルを作成したいですか?

これを行うには多くの方法があります。

ローカルで作成する場合(=同じマシン上):

tar czvf /path/to/destination/newfile.tar.gz  ./SOURCEDIR_OR_FILES

そのコマンドの最後に、追加のファイルまたはディレクトリをtarに追加できます。

リモートで作成する場合(つまり、風袋引きするデータを含むホストからリモートホストにtarファイルを作成する場合):

tar czvf - ./SOURCEDIR_OR_FILES | ssh user@Host 'cat > newfile.tar.gz'

後のバージョンは非常に用途が広いです。たとえば、同じ手法を使用して、ディレクトリ+サブディレクトリを「複製」することもできます。

ディレクトリ+サブディレクトリを別のローカルディレクトリに複製します。

tar cf - ./SOURCEDIR_OR_FILES | ( cd LOCAL_DEST_DIR && tar xvf - )

ディレクトリ+サブディレクトリを別のリモートディレクトリに複製します。

tar cvf - ./SOURCEDIR_OR_FILES | ssh user@Host 'cd REMOTE_DEST_DIR && tar xf - '

ファイルがtarされている(またはuntarされている)ため、ファイルを表示する必要がない場合は、「v」をドロップします。これにより、速度は大幅に向上しますが、エラーが発生しない限り、あまり意味がありません。

ソースに「。/ ...」を使用して、tarにRELATIVEパスとして保存するように強制しています。場合によっては、追加のパス情報を追加する必要があります。

たとえば、/ etc内のファイルを含むcrontabファイルをtarするには、次のようにします。

cd / ; tar czf all_crons.tgz  ./etc/*cron*  ./var/spool/cron

私は意図的に相対パスを使用しています。tarの一部の古いバージョンは危険な場合があり、元のGLOBALパスでファイルを抽出します。つまり、次のことができます:cd /safedir ; tar xvf sometarおよびグローバル名のファイルが元のパスにあるファイルを上書きするようにします。これは、/ safedirの外側にあり、その下にはありません!古いプロダクションサーバーが存在するため、非常に危険です。最近のtarを使用している場合でも、常に相対パスを使用するほうがよいでしょう。

5
Olivier Dulac

使用 -h tarオプション。 manページから:

-h, --dereference
don't archive symlinks; archive the files they point to

tar -zcvfh data-folder.tar.gz /opt/data-folder

0
harish.venkat