【问题标题】:Using `cp` within `find` while preserving directory structure (bash) [duplicate]在“find”中使用“cp”,同时保留目录结构(bash)[重复]
【发布时间】:2018-06-08 08:49:58
【问题描述】:

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

我有一个这样的目录结构。操作系统为 Ubuntu 16.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 内的此语句中不起作用。当我使用其中任何一个时,它们似乎完全阻止了复制的发生。

我做错了什么?有没有更好的方法来做到这一点?

非常感谢。

【问题讨论】:

  • @tripleee 不完全重复,因为 OP 发现了 cp--parents 选项。他的问题其实是在复制文件的时候去掉第一层路径。
  • 那里有多个答案可以解决这个特定方面,包括rsynctar
  • 我找到的答案,包括你提到的那个,只是一个简单的副本。我只想复制某些文件。由于我没有太多 bash 经验,你可能是对的,我只需要简单地复制整个目录,然后在 find 中选择性地选择 rm

标签: bash find cp


【解决方案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 将创建目标目录,如果该目录已经存在则不会报错。

一旦创建目录,复制就完成了。

【讨论】:

  • 非常感谢。代码比我预期的要复杂。目录的数量会对代码产生影响吗?例如。 pathtofolder=/var/www/website/laravel/folderpathtoarchive=/var/www/website/laravel/archives.
  • 我是否使用了正确的方法?将它分成两部分以先找到旧文件会更简单,然后我想我可以使用cp -a,或者我可以以更简单的方式进行复制。
  • @sdexp 应该没什么区别,但是由于您的源目录和目标目录共享相同的路径,因此/var/www/website/laravel 并从那里执行find 命令可能更容易。跨度>
  • @sdexp 另一种方法是使用rsync
  • 非常感谢。不幸的是,当我尝试你的方法时,我仍然得到archives/var/www,而且我离调试还很远。正如您所说,使用rsync 可能会容易得多,只需复制所有文件即可。然后只删除太旧的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2017-06-22
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多