如何复制过去5分钟内添加到特定目录的所有文件?

How to copy all files added to a specific directory in the past 5 minutes?

我想知道如何复制过去五 分钟 内添加到特定目录的文件。这些文件不一定是在目录中创建的(即,可以从不同的目录复制过来)。这些文件有一个特定的格式,其中包括创建日期和时间,但是我更希望文件的选择不依赖于文件名中的 date/time 标记。如何做到这一点?

更改文件目录不会更新修改时间或访问时间,但会更新更改时间。你只需要在 find 上使用 -ctime 标志来捕获这个:

$ mkdir test
mkdir: created directory ‘test’
$ cd test
$ touch a
$ stat a
  File: ‘a’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d  Inode: 2117512     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/moriarty)   Gid: (  100/   users)
Access: 2015-02-13 10:24:16.777863605 -0600
Modify: 2015-02-13 10:24:16.777863605 -0600
Change: 2015-02-13 10:24:16.777863605 -0600
 Birth: -
$ mkdir b
mkdir: created directory ‘b’
$ mv a b
$ stat b/a
  File: ‘b/a’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d  Inode: 2117512     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/moriarty)   Gid: (  100/   users)
Access: 2015-02-13 10:24:16.777863605 -0600
Modify: 2015-02-13 10:24:16.777863605 -0600
Change: 2015-02-13 10:24:26.354530678 -0600
 Birth: -
$ find b -cmin -5
b
b/a

如果你想让 find 忽略该目录,只需传递一个 -type f 意味着只考虑文件。

$ find b -type f -cmin -5
b/a

然后您可以使用其 -exec 参数将 cp 命令传递给它,它将对每个结果执行该命令。使用 -print 或仅使用上面的简单命令(没有 -exec)来查看它正在捕获什么。

$ mkdir c
mkdir: created directory ‘c’
$ find b -type f -cmin -5 -exec cp '{}' c \;
$ ls c
a

编辑:

我能想到的在不支持 -cmin 的系统(如 HP-UX)上执行此操作的唯一方法基本上是创建一个临时虚拟文件,其中包含指示您想要的时间的时间戳(五分钟前在你的情况下)并与之进行比较。您可以根据需要在 Unix 文件上设置时间戳 touch -t and then use the -newerc argument to find to select files with a newer change time than the standard one you just made. I found an online reference 据称是 2007 年左右的 HP-UX 手册,表明它确实支持 newer[xy] 语法。

我能够通过使用此代码块获得所需的功能:

# Fill date variables 
date '+%Y %m %d %H %M %S' | read in_Y in_m in_d in_H in_M in_S

# Decrease month count to account for first month being at index 0
((in_m=$in_m-1)) 

# Get current time in seconds since epoch
perl -e "use Time::Local; print timelocal($in_S,$in_M,$in_H,$in_d,$in_m,$in_Y), ;" | read cur_S

# Go back five minutes
((old_S=$cur_S-300))

# Change to required format
perl -e 'use POSIX qw(strftime);\
print scalar(strftime "%Y %m %d %H %M %S", localtime $ARGV[0]), "\n";' $old_S | read Y m d H M S

# Create temp file to act as time reference
touch -amt ${Y}${m}${d}${H}${M}.${S} ${tempFileDest}

cd $testSourceDir

# Find files created in past five minutes
find . -type f -newer temp -name $fileNameFormatTest -exec cp -pf {} $testDestDir \;

感谢您的帮助!

注意:这是针对 HP-UX 的解决方法,它不支持 'find' 命令的 -amin、-cmin、-mmin 选项。