ファイルを圧縮してコピーし、ディレクトリ構造を維持する方法は?

ファイルを圧縮してコピーし、ディレクトリ構造を維持する方法は?

Linuxで1つのコマンドを使用してファイルを圧縮し、別のフォルダにコピーし、ディレクトリ構造を維持する方法は?

たとえば、次のようになります。

/dir1
/dir1/file1.fit
/dir1/file2.fit
/dir1/file3.fit
/dir1/dir2/file1.fit
/dir1/dir2/file2.fit
/dir1/dir2/file3.fit

コマンドを使用した後(/dir1にコピーすると仮定/another_dir)、次のようになります。

/another_dir/dir1
/another_dir/dir1/file1.fit.gz
/another_dir/dir1/file2.fit.gz
/another_dir/dir1/file3.fit.gz
/another_dir/dir1/dir2/file1.fit.gz
/another_dir/dir1/dir2/file2.fit.gz
/another_dir/dir1/dir2/file3.fit.gz

これは/another_dir実際に別のハードドライブです。このターゲットドライブに十分なスペースがないため(データ2TB)、最初にファイルをコピーしてからすべてgzipに圧縮することを提案しないでください(またはその逆)。同様に、gzファイルは作業後に元のフォルダに残ってはいけません。

答え1

圧縮用のすべてのディレクトリ(あなたの場合)が含まれているルートフォルダにあると仮定すると、次のコマンドを使用/できます。findxargs

find dir1/ -name "*.fit" -print0 | xargs -i% -r0 sh -c 'mkdir -vp "$(dirname "/another_dir/%")" && gzip -vc "%" | tee "/another_dir/%".gz > /dev/null && rm -v "%"'

| tee "/another_dir/%".gz > /dev/null注:に置き換えることもできます> "/another_dir/%".gz

.fitその後、その中のすべてのファイルを見つけて、各ファイルが置き換えられる解析コマンドdir1/に渡されます。xargs%

このxargsコマンドは次のことを行います。

  • 空のフォルダ(mkdir)を作成し、そのフォルダ-p)はプレースホルダとして使用されません。
  • 与えられたファイル(%)を標準出力(-c)に圧縮し、圧縮された出力にリダイレクトしますtee
  • tee.gz圧縮された入力をファイルに保存します(tee入力はデフォルトで端末画面に印刷され/dev/nullます。

圧縮が成功したら、元の(rm)を削除してください。圧縮ファイルを確認したら、いつでもこのセクションを削除して圧縮ファイルを手動で削除できます。

重要なのは、相対フォルダにあるため、返されたdir1/すべてのパスがfind現在のフォルダに基づいているため、別々に作業する必要がないことです。絶対パスを相対パスに変換realpath(たとえば、この操作を実行できますが、上記のrealpath --relative-to=$absolute $currentコマンドは複雑すぎます。)

-rmacOSでは、引数を使用するにはGNU()をxargsインストールし、代わりにコマンドを使用する必要があります。他のBSDシステムと似ています。xargsbrew install xargsgxargs

関連質問:複数のディレクトリに複数のファイルをgzipで圧縮し、新しいディレクトリにコピーする

答え2

これを行うことができる単一のコマンドはありませんが、ServerFaultから同じ機能を実行する単純なスクリプトの例です。ファイル権限やアクセス/変更時間は保持されず、ファイル名にスペースなどが含まれていると問題が発生する可能性があります。

関連情報