如何复制过去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 选项。
我想知道如何复制过去五 分钟 内添加到特定目录的文件。这些文件不一定是在目录中创建的(即,可以从不同的目录复制过来)。这些文件有一个特定的格式,其中包括创建日期和时间,但是我更希望文件的选择不依赖于文件名中的 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 选项。