查找一天以内的新文件并复制

查找一天以内的新文件并复制

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

这就是我所拥有的:

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

上面的代码复制了源目录中的所有文件。如果我删除“cp”的所有参数,那么它会起作用:

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

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

我还尝试过变量和 for 循环,认为 -exec 选项可能是问题所在:

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

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

我怎样才能让它发挥作用?

答案1

一些实现cp有一个-t选项,所以你可以把目标目录文件:

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

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

答案2

感谢大家的帮助,结合您的建议使其正常工作:

使用下面的代码,它工作得很好。

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

再次感谢!

答案3

您可以pax这样使用:

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

命令行一点一点:

  • -wr- 当pax同时提供-write 和-read 选项时,它会复制。可能在这里也有用。(但不包含在上述命令中)

    • -link - 如果可能的话,它会创建硬链接,而不是复制文件数据。

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

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

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

  • -T- -Time 选项选择目标存档的文件(或仅在与 一起使用时进行复制-wr基于他们的/m修改或/cinodehange(或两者)次。它默认为修改时间。从...

男人帕克斯

  • ...当 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 或以后修改或 inode 更改时间的所有文件。

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

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

...除了 - 最后值得一提的事情 - 我对目标目录使用绝对路径 - 如果你这样做,你也应该这样做。该文档全部参考未指定的行为对于相对目标路径 - 我第一次尝试使用时,pax我低声咒骂了一个小时,对所有奇怪的结果感到困惑,直到我使用了绝对路径。

答案4

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

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 的信息这里

相关内容