フォルダ構造なしで複数のフォルダ内の複数のファイルを圧縮します。

フォルダ構造なしで複数のフォルダ内の複数のファイルを圧縮します。

現在、次のようにログファイルのコピーを作成します。

# tar -cvzf /var/www/vhosts/example.com/httpdocs/myfiles.tar.gz 
  /var/www/vhosts/example.com/logs/access_log       
  /var/www/vhosts/example.com/httpdocs/app/tmp/logs/error.log 
  /var/log/mysqld.log
  /var/log/messages 
  /var/log/httpd/access_log
  /var/log/httpd/suexec_log 
  /var/log/httpd/error_log 
  /var/log/sw-cp-server/error_log
  /usr/local/psa/var/log/xferlog
  /etc/php.ini 

ただし、これによりディレクトリ構造のtarファイルが作成されます。フォルダ構造を回避するには、cdすべてのファイルがサブフォルダなしでtarファイルとして保存されるように、ファイルごとにファイルを作成する必要があるようです。 (tar.gzファイルにも問題がありますが、tarコマンドはファイルが圧縮されている場合はアーカイブファイルの更新を許可しません。)

ただし、この場合、同じ名前のファイルが複数存在します(例:access_logという2つのファイル)。

したがって、ターゲットログファイルの名前を変更する必要があります。
例えば

/var/www/vhosts/example.com/logs/access_log   to  -var-www-vhosts-example.com-logs-access_log

/var/log/httpd/access_log  to   -var-log-httpd-access_log

ディレクトリ構造とファイル名を変更せずにこれらのファイルをアーカイブできますか?ファイルは別のフォルダに存在します。

答え1

GNU tar support--transform=expressionあなたの場合はそうです--transform s,/,-,(リーディングがなければ-大丈夫です)。

答え2

@Marksの返信に追加

-Tコマンドとスイッチを使用して--transformこれを行うことができますtar

私のディレクトリ構造は次のとおりです。

|-- foo1
|   |-- file1.txt
|   |-- file2.txt
|   `-- file3.txt
|-- foo2
|   |-- file4.txt
|   |-- file5.txt
|   `-- file6.txt
|-- foo3
|   |-- file7.txt
|   |-- file8.txt
|   `-- file9.txt
`-- foo4
    |-- file10.txt
    |-- file11.txt
    `-- file12.txt

ディレクトリ名を含むファイルを圧縮できます。

$ find -type f | tar --transform="s,/,-,2" -czvf compress.tgz -T -

ディレクトリ名は含まれません。

$ find -type f | tar --transform="s,.*/,," -czvf compress.tgz -T -

関連情報