パスなしですべてのファイルを圧縮する方法

パスなしですべてのファイルを圧縮する方法

現在のディレクトリとサブディレクトリですべての.cファイルを見つけて圧縮したいと思います。これを達成するために、次の方法を試しましたが、ファイルを解凍すると、ファイルは別のフォルダにあります。ファイルを圧縮するときにディレクトリを含めたくありません。

スクリプトは他のすべてのファイルを除外し、これらの.cファイルのディレクトリ構造を維持しないでください。

find . -name '*.c' | xargs tar -rf allcfiles.tar 

ここに画像の説明を入力してください。

答え1

GNUtar(Linuxで一般的)がある場合は、この--transformオプションを使用できます。

たとえば、現在のコマンドを使用すると、次のディレクトリがあることを確認できます。

$ find . -name '*.c' | xargs tar -rf allcfiles.tar
$ tar tf allcfiles.tar                            
./b.c
./d/e.c
./a.c

以下を変換することでこれを防ぐことができます。

$ find . -name '*.c' | xargs tar --transform='s!.*/!!' -rf allcfiles.tar
$ tar tf allcfiles.tar                                                  
b.c
e.c
a.c

中の表現は--transform簡単なsed表現です。これはすべてのディレクトリコンポーネントを削除するだけです。

答え2

find実装がこのオプションをサポートしている場合は、次のようにディレクトリなしでファイルを削除-execdirできます。tar

find . -name '*.c' -type f -execdir tar rf $PWD/mytar.tar {} +

tarファイルのパスが絶対パスであることを確認してください。

答え3

POSIX準拠のコマンドのみを使用してこれを行う方法は次のとおりです。

find . -name '*.c' | pax -w  -s ',.*/,,' > allcfiles.tar

を使うのが好きなら、tar rf archive ...右から始める必要があります。tarリアルモードではアーカイブが作成されないため、最初からアーカイブしますreplace。これを行うには、まず次のコマンドを実行して空のTARアーカイブを作成できます。

printf "\000"| dd ibs=10k conv=sync > allcfiles.tar 

しかし、私はこのコマンドを好みます:

star cf allcfiles.tar -s ',*/,,' -find . -name '*.c'

これは、そのデータがアーカイブのファイルメタデータを設定するために使用されるため、ファイルごとにstar一度だけlibfind呼び出す必要があるため、最速の方法です。stat()statlibfindstar

関連情報