这是在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
中的此语句中不起作用。当我使用其中任何一个时,它们似乎都会阻止副本发生。
我做错了什么?有更好的方法吗?
非常感谢。
答案 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
将创建目标目录,如果目录已存在则不会抱怨。
创建目录后,副本就完成了。