その中に多くのサブフォルダがあるディレクトリがあり、サブフォルダの下に他のサブフォルダがあります。すべてのディレクトリとサブディレクトリを別の場所にコピーし、階層を維持しながら、このディレクトリに特定の名前のファイルのみをコピーしたいと思います。
すべてのディレクトリとサブディレクトリがコピーされたと仮定すると、そのディレクトリに拡張子を持つファイルがある場合、.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