在保留目录结构的同时在 `find` 中使用 `cp` (bash)

Using `cp` within `find` while preserving directory structure (bash)

这是一个关于在 find 中使用 cp 同时保留目录结构的具体问题。这是看起来应该起作用的方式,但也许有一种方法可以做得更好。我使用 find 的原因是因为我只想复制特定年龄的文件。

我有这样的目录结构。操作系统是Ubuntu16.04.

folders
   folder1
     file1.txt
   folder2
     file1.txt
     file2.txt
   folder3
     file1.txt

我在 find 命令中使用 cp 命令,因此...

find "$pathtofolder"/* -mmin +"$timeinmins" -type f -name "*.txt" -exec cp --parents {} /var/www/website/archives \;

--parents 标志将整个路径复制到文件,所以我得到类似 archives/var/www/website/folders/folder1/file1.txt 的内容。这不是我想要的。我只想要 archives/folder1/file1.txt.

-R-a 标志在 find 内的这条语句中不起作用。当我使用它们中的任何一个时,它们似乎完全阻止了复制的发生。

我做错了什么?有更好的方法吗?

非常感谢。

给定以下变量:

pathtofolder="/tmp/test" 
pathtoarchive="/var/www/website/archives" 

你可以使用这个:

 find "$pathtofolder" -type f -mmin +"$timeinmins" -exec bash -c 'dir="/$(sed "s,^,,;s,/[^/]\+$,," <<< "")"; mkdir -p "$dir"; cp -v "" "$dir"' _ {} "$pathtoarchive" "${pathtofolder}/folders/" \;

sed用于制作目标目录并将其赋值给变量dir。该命令从 find.

找到的文件名中删除一级目录和名称

mkdir -p 将创建目标目录,如果目录已经存在则不会报错。

创建目录后,复制完成。