ディレクトリ内のすべてのファイルを再帰的にコピーし、圧縮されたファイルの圧縮を動的に解く方法[閉じる]

ディレクトリ内のすべてのファイルを再帰的にコピーし、圧縮されたファイルの圧縮を動的に解く方法[閉じる]

多くのサブディレクトリがあるディレクトリには、大規模な標準/圧縮ファイルのコレクションがあります。

この構造化ディレクトリとすべてのコンテンツ(ファイルとサブディレクトリ)を別のディスクにコピーし、すべての圧縮ファイルを解凍する必要があります。

したがって、時間を節約するためにディレクトリ内のすべてのファイルを再帰的にコピーし、すぐに圧縮されたファイルを解凍したいと思います。

どうすればいいですか?

答え1

ソースディレクトリとターゲットディレクトリとして、およびを使用して$SOURCE3つの別々の手順に分けます。$DEST

  1. ターゲットディレクトリにソースディレクトリ構造を再作成します。

    find $SOURCE -type d | sed -e "s~^$SOURCE~~" | xargs -r -I dir mkdir -p "$DEST"/"dir"

  2. 解凍する必要のないファイルはすべて移動してください。

    find $SOURCE -type f -not -name '*.gz' | sed -e "s~^$SOURCE/~~" | xargs -r -I file cp "$SOURCE"/"file" "$DEST"/"file"

  3. すべての圧縮ファイルをターゲットディレクトリに抽出します。

    find $SOURCE -type f -name '*.gz' | sed -e "s~^$SOURCE~~" | sed -e "s~.gz$~~" | xargs -r -I file bash -c 'gzip -dc "'"$SOURCE"'"/"file".gz > "'"$DEST"'"/"file"'

つまり、提案に従ってrsync -avすべてのファイルコピーを使用してから、ターゲットfind . -name '*.gz' -exec gunzip \{\} \;ディレクトリにファイルを解凍することをお勧めします。これは潜在的なリスクが少ないより簡単なアプローチです。 (上記の3つのステップは、限られた数のファイルと比較的単純なファイル名を持つ小さなテストディレクトリで私にとって効果的でした。YMMVはより複雑なユースケースに適しています。)

答え2

tar好きなコマンドのようです。

tar cf - <dir> | (cd <path-to-other-dir>; tar xf -)私は通常、ディレクトリの内容を別のフォルダにコピーしたいときにこれを使用します。

関連情報