复制具有绝对路径和通配符的文件列表,并在目标中保留源路径

复制具有绝对路径和通配符的文件列表,并在目标中保留源路径

我想将文本文件中列出的文件以绝对路径复制到另一个文件夹,并保留目标中的文件夹树。

在2.txt中:

//PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T070720.*
//PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T064927*
//PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T070210.xml

我希望源文件夹树保留在输出文件夹中。

outd=/cygdrive/c/0/out27/
rsync -vR --include-from=in2.txt / $outd

产生以下结果并且不复制任何内容:

$   rsync -vR --include-from=in2.txt / $outd
skipping directory /.
sent 17 bytes  received 12 bytes  19.33 bytes/sec
total size is 0  speedup is 0.00

尝试使用 --parents 进行 cp:

while read p; do
  cp --parents "$p" $outd  # i had problem with unc path  //corp-fs01
done <in2.txt

产量..

//PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T070210.xml
cp: failed to get attributes of '/PMDA-SO5632': No such file or directory

我该如何实现复制?不一定非要使用 rsync 或 cp。

答案1

不要以为该-R属性可以完成您想要完成的任务。通常,存档属性就足够了。Rsync 将根据匹配的第一个规则执行操作。而那些不匹配任何规则的对象将不是被跳过并且应该被完全排除。

rsync -va --include-from=in2.txt --exclude='*' / $outd

父目录也必须包括在内,否则它们将被排除'*',并且 rsync 将不会递归遍历目录结构。

/PMDA-SO5632/
/PMDA-SO5632/data/
/PMDA-SO5632/data/vision_6830/
/PMDA-SO5632/data/vision_6830/image_data/
/PMDA-SO5632/data/vision_6830/image_data/top_surface/
/PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/
/PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/
/PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T070720.*
/PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T064927*
/PMDA-SO5632/data/vision_6830/image_data/top_surface/nok/220104/inner_rim_220110T070210.xml

另一个解决方案是在 rsync 处理之前展开 in2.txt 中的所有文件对象,然后改用--files-from=。它将仅复制文件中包含的对象,而无需添加任何其他父目录。

rsync < in2.txt -va --files-from=- / $outd

相关内容