首页 > 解决方案 > 仅在一定深度上等效于“cp --parents”

问题描述

这是我的问题:

我有一个名为archive的文件夹,其中包含以下格式的许多子目录和文件:

/home/user/archive/$YYYY/$MM/$DD

我想复制一些特定的文件,/tmp同时保留部分目录树。到目前为止,我想出了

find /home/user/archive -mtime +1 -type f -exec cp --parents {} /tmp;

(该find ... -mtime +1 -type f部分实际上返回了我想要复制的内容)

但是,输出是格式/tmp/home/user/archive/$YYYY/$MM/$DD ,而我想要的输出格式是/tmp/archive/$YYYY/$MM/$DD

有什么解决办法吗?:)

标签: bashshellfindcp

解决方案


一种选择是在解析 find 的输出后通过 awk 的系统函数运行副本。这样的解决方案将要求目录/子目录结构在所有情况下都相同:

find /home/user/archive -mtime +1 -type f | awk -F\/ '{ print "mkdir -p /tmp/"$4"/"$5"/"$6";cp --parents "$0 " /tmp/"$4"/"$5"/"$6"/"$7 }'

这将打印您需要为从 find 命令找到的每个条目执行的复制命令。确保命令按预期打印(这一步非常重要)

一旦您确认命令按预期显示,您可以通过 awk 的系统函数运行实际的复制命令:

find /home/user/archive -mtime +1 -type f | awk -F\/ '{ system("mkdir -p /tmp/"$4"/"$5"/"$6";cp --parents "$0 " /tmp/"$4"/"$5"/"$6"/"$7) }'

推荐阅读