通过复制具有特定名称的文件在另一个文件夹中创建相同的子文件夹

通过复制具有特定名称的文件在另一个文件夹中创建相同的子文件夹

我有一个目录,其中有许多子文件夹,子文件夹下还有其他子文件夹。我想将所有目录和子目录复制到另一个位置,并仅复制这些目录中具有特定名称的文件(同时保留层次结构)。

假设复制所有目录和子目录,那么如果这些目录中有带.txt扩展名的文件,也复制它们。

在 Unix/Linux 系统上执行此操作的最佳方法是什么?

答案1

使用rsync

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

source_dir这应该创建一个目录层次结构的副本target_dir,其中包含名称与*.txt复制的文件(仅)匹配的文件。

--include和选项--exclude以从左到右的方式处理,第一个匹配名称的模式“获胜”。此处使用这些选项的方式可确保处理所有目录以及任何匹配的名称*.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

相关内容