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

时间:2018-06-08 08:49:59

标签: bash find cp

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

我有这样的目录结构。操作系统是Ubuntu 16.04。

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

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

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中的此语句中不起作用。当我使用其中任何一个时,它们似乎都会阻止副本发生。

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

给出以下变量:

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

你可以用这个:

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

sed用于创建目标目录并将其分配给变量dir。该命令从find找到的文件名中删除第一级目录和名称。

mkdir -p将创建目标目录,如果目录已存在则不会抱怨。

创建目录后,副本就完成了。