我正在编写一个脚本,该脚本将仅将最后一天创建的文件复制到另一个文件夹。我遇到的问题是我的脚本复制了源目录中的所有文件,而不仅仅是不到一天的文件。
这就是我所拥有的:
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
同时提供-w
rite 和-r
ead 选项时,它会复制。可能在这里也有用。(但不包含在上述命令中)-l
ink - 如果可能的话,它会创建硬链接,而不是复制文件数据。-X
用于限制pax
相同的源设备和/或文件系统。-s/src regex/replace/
- 修改流中的文件名-v
erbose - 用于报告来源/目标文件。
-T
--T
ime 选项选择目标存档的文件(或仅在与 一起使用时进行复制-wr
)基于他们的/m
修改或/c
inodehange(或两者)次。它默认为修改时间。从...
男人帕克斯
...当 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. 我总是有一份上次恢复的压缩格式的副本。
另外,我在恢复之间有一个暂停,我可以去检查这些文件是什么,如果一切正常,则继续执行脚本。
它保留了文件夹结构,因此它只是将修改后的文件从源目录覆盖到目标目录
注意:另一方面,如果要求不受日期限制,我会使用 rsync
rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/
更多有关带有日期的 rsyc 的信息这里