查找比一天更新的文件并进行复制


12

我正在使用一个脚本,该脚本将仅将过去一天创建的文件复制到另一个文件夹。我遇到的问题是我复制了源目录中的所有文件的脚本,而不是仅仅复制了不到一天的文件。

这就是我所拥有的:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

上面的代码复制源目录中的所有文件。如果我删除“ cp”的所有参数,则可以使用:

find . -mtime -1 -exec cp "{}" /somefolder \;

上面的代码仅复制我想要的最新文件,但我需要使用cp参数保留属性。

我也尝试过变量,并且对于循环的思考可能是-exec选项是问题所在:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

但是,上述for循环会导致相同的问题,所有文件都将被复制。如果我回显$ files,则仅显示我需要的文件。

我该如何工作?


1
好的,我认为我可以使用:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234 2014年

rsync不是代替cp的更好工具吗?rsync-源目的地
Darryl

Answers:


9

的某些实现cp有一个-t选项,因此您可以将目标目录放在文件之前

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

请注意,这-a意味着--preserve我删除了后者。


这还会复制包含旧文件的文件夹吗?
Luis A. Florit

3

您可以这样使用pax

pax -wrT "11$(date +%H%M)," . /destination/folder

命令行逐位:

  • -wr- pax交给-w仪式和-read选项时都会复制。在这里也可能有用。(但不包含在以上命令中)

    • -l墨水-尽可能创建硬链接,而不是复制文件数据。

    • -X用于限制pax到同一源设备和/或文件系统。

    • -s/src regex/replace/ -修改流内文件名

    • -verbose-用于报告源/目标文件。

  • -T-在-T目标归档IME选项中选择文件(或使用时仅复制-wr基于其/modification或索引节点/c酣歌(或两者)倍。默认为mod时间。从...

男士

  • ...使用pax创建基于时间的增量归档时,使用两个文件时间进行时间比较非常有用(仅归档在指定时间范围内更改的文件)。

  • 时间范围由六个不同的字段组成,每个字段必须包含两位数字。格式为:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • 其中,cc是年份的前两位数字(世纪),yy是年份的后两位数字,第一位mm是月份(从01到12),dd是月份中的天(从01到31),HH是一天的小时(从00到23),MM分钟(从00到59)和SS秒(从00到59)。分钟字段MM是必填字段,而其他字段是可选字段,必须按以下顺序添加:

    HH, dd, mm, yy, cc

  • SS字段可以独立于其他字段添加。时间范围是相对于当前时间的,所以...

    -T 1234/cm

  • ...将选择今天或以后的所有修改或索引节点更改时间为12:34 PM的文件。

  • -T可以提供多个时间范围,并在第一个匹配项时停止检查。

...所以11我的示例命令中的相对位置是相对于今天的-比今天的日期少一个-这是第十二个-其余的只是标准"$(date)"格式,后跟逗号。

...除了-值得一提的最后一件事-我为目标目录使用了绝对路径-如果这样做的话也应该如此。所有文档都针对相对目标路径引用了未指定的行为 -第一次尝试使用时,pax我一直屏住呼吸一个小时,与所有奇怪的结果相混淆,直到使用绝对路径为止。


2

感谢大家的帮助,并结合您的建议使其有效:

与下面的代码一起使用,它完美地工作。

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

再次感谢!


2

我在做完全相同的功能,但需要保留文件夹结构。因此,我所做的有些不同。

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

其中$ days是天数$ tarpath是用于存储这些文件的临时路径。当我想还原时

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

那对我来说成功了。

注意:如果要在备份时排除某些文件夹,可以使用以下命令

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

优点:1.我始终以压缩格式保存上次还原的副本。

  1. 另外,在恢复之间我有一个停顿,我可以去那里检查那些文件,如果一切正常,请继续执行脚本。

  2. 它保留了文件夹结构,因此只将修改后的文件从源目录覆盖到目标目录

注意:另一方面,如果要求不受日期限制,我将使用rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

有关rsyc的更多信息,请点击此处


1

除了返回特定天数之外,还可以选择确切的日期和时间

(这仅在文件名中没有空格,制表符或通配符的情况下才有效)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

上方将目录中所有在2016年12月17日20:10:00之后创建的文件复制到文件夹(今天前1天:)

注意find命令的符号,不是这个:'是这个,反引号:`日期选择带有这个:'

对于名称中带有空格,制表符,换行符或通配符的文件,可以使用StéphaneChazelas提供的两种解决方案之一,第一种用于GNU,第二种用于GNU或某些BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


感谢Stephane,这也许就是为什么我在任何帖子中都找不到它的原因,尽管对我而言,它就像一个魅力。当您这样做时只能找到。-f -newermt'2016
00'–

...它会打印在那之后创建的文件,我不确定它可能会导致什么样的问题。然后我只使用反引号选择要复制的这些文件。欢呼声
FatihSarigol '16

我相信您分享的帖子是关于“循环”的,我的代码是否循环遍历find的结果?还是只是选择查找结果以供复制使用?(对不起,有3条评论,我现在显然还不能编辑我的评论
FatihSarigol 2016年

1
使用find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU)或find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU或某些BSD(可移植性的限制因素是-newermt此处的前提))。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.