我想运行一个每天早上运行的 cronjob,将前一天在特定目录中创建的文件移动到使用之前日期标题创建的文件夹中。
例如,Motion 在名为快照的目录中创建了一系列 jpg 文件。我想让脚本运行并找到快照目录中昨天创建的所有文件(包括它创建的 avi 文件),并将它们移动到以昨天的日期为标题的文件夹中。
有人试过吗?Motion 是否已经内置了此功能,而我只是没有看到它?
下一步是让它在 7-14 天后自动清除,但那是另一篇文章的内容。
答案1
这可以通过 轻松完成find
。相关选项包括:
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a `\') or quoted to
protect them from expansion by the shell.
因此,要移动过去 24 小时内在目录jpg
中创建的所有文件,你可以运行snapshots
find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 -exec mv {} /path/to/dest
被找到的每个文件名替换{}
。引号不是必需的,因为find
在执行命令之前可以妥善处理奇怪的文件名。表示+0
“文件上次修改时间至少atime
1*24小时前,如上面引用的部分所述。
如果您想将这些内容移动到以昨天的日期命名的目录中,则必须创建它(使用选项,-p
如果mkdir
目录存在则不会抱怨):
mkdir -p $(date -d yesterday +%F)
该date
命令将以以下YYYY-MM-DD
格式打印昨天的日期。例如,2014-06-18。您可以将两个命令合并到同一个find -exec
调用中(\
后面的命令-mtime
只是为了方便阅读,它允许您将命令分成多行):
find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 \
-exec bash -c "mkdir -p $(date -d yesterday +%F) && mv {} $(date -d yesterday +%F)" \;
因此,要使用 运行它,您可以在(run )cron
中添加如下一行:crontab
crontab -e
0 9 * * * find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 -exec bash -c "mkdir -p $(date -d yesterday +%F) && mv {} $(date -d yesterday +%F)" \;
上述find
命令将在每天上午 9 点运行。
答案2
find /path/to/my/folder/ -type f -mtime -1 -exec ls -l "{}" \;
如果您想移动它们,您可以更改 exec 命令:
find /path/to/my/folder/ -type f -mtime -1 -exec mv "{}" /path/to/my/newfolder/ \;
"{}"
是与搜索匹配的每个文件名的完整路径。
\;
命令行末尾需要。
您可以使用以下方法删除它们-delete
:
find /path/to/my/folder/ -type f -mtime -1 -delete