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

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

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で圧縮し、新しいディレクトリにコピーする

おすすめ記事