我有一个目录,其中有许多子文件夹,子文件夹下还有其他子文件夹。我想将所有目录和子目录复制到另一个位置,并仅复制这些目录中具有特定名称的文件(同时保留层次结构)。
假设复制所有目录和子目录,那么如果这些目录中有带.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