特定の名前のファイルをコピーして別のフォルダに同じサブフォルダを作成する

特定の名前のファイルをコピーして別のフォルダに同じサブフォルダを作成する

その中に多くのサブフォルダがあるディレクトリがあり、サブフォルダの下に他のサブフォルダがあります。すべてのディレクトリとサブディレクトリを別の場所にコピーし、階層を維持しながら、このディレクトリに特定の名前のファイルのみをコピーしたいと思います。

すべてのディレクトリとサブディレクトリがコピーされたと仮定すると、そのディレクトリに拡張子を持つファイルがある場合、.txtそのファイルもコピーされます。

Unix / Linuxシステムでこれを行う最善の方法は何ですか?

答え1

使用rsync:

rsync -a --include='*/' --include='*.txt' --exclude='*' source_dir/ target_dir

source_dirこれにより、コピーされたファイルと名前が一致するファイルをtarget_dir含むディレクトリ階層のコピーが作成されます。*.txt

--includeオプションは、--exclude「wins」という名前に一致する最初のパターンを使用して左から右に処理されます。ここでこれらのオプションを使用すると、すべてのディレクトリに一致する名前が処理されますが、*.txt他のすべては無視されます。

-a()オプションを使用する--archiveと、source_dir階層が再帰的に処理され、できるだけ多くのファイルメタデータがコピーに保存されます(rsync詳細についてはドキュメントを参照)。

答え2

(絶対)ターゲットディレクトリがあることを確認してください。

mkdir -p "$DST_DIR"

ソースディレクトリに移動します($ DST_DIRの下位ディレクトリまたは親ディレクトリではありません)。

cd "$SRC_DIST"

ディレクトリ構造を再作成します(ディレクトリ名に「\ n」が含まれている場合は失敗します)。

find . -type d -print | xargs -I% mkdir -p "$DST_DIR"/%

興味のあるファイルをコピーします(この場合は* .txtと* .h)。

find . \( -name \*.txt -o -name \*.h \) -print0 | cpio -pvdm0 "$DST_DIR"

サイドノート

ターゲットファイルが含まれていないディレクトリが望ましくない場合は、次のことができます。

find . \( -name \*.txt -o -name \*.h \) -print0 \
| cpio -pvdm0 $DST_DIR

関連情報