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
圧縮用のすべてのディレクトリ(あなたの場合)が含まれているルートフォルダにあると仮定すると、次のコマンドを使用/
できます。find
xargs
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
コマンドは複雑すぎます。)
-r
macOSでは、引数を使用するにはGNU()をxargs
インストールし、代わりにコマンドを使用する必要があります。他のBSDシステムと似ています。xargs
brew install xargs
gxargs
答え2
これを行うことができる単一のコマンドはありませんが、ServerFaultから同じ機能を実行する単純なスクリプトの例です。ファイル権限やアクセス/変更時間は保持されず、ファイル名にスペースなどが含まれていると問題が発生する可能性があります。