我想查找(并删除)目录中已存在超过 X 天的所有文件。我知道我可以使用 查找一小时内未修改的文件find /directory/* -mmin 3600
,但是当我将 Windows 上的旧文件复制到 Debian 服务器上的目录中时,它会保留其年龄,我无法知道它在那里待了多长时间。
答案1
有一个 shell 脚本。
#!/bin/sh
inotifywait --monitor --format="%e %f" --event=create,moved_from,moved_to,delete $directory |
while read event file
do
case "$event" in
# asterisks needed because directory events end in ",ISDIR"
(CREATE*)
echo "$(date +%s) $file" >>"$index"
;;
(MOVED_TO*)
# moved_to includes overwrites, so we have to grep out the file, to make sure it wasn't already there
# use `sponge` to enable safe reading and writing of the index in the same pipeline
grep -Fv " $file" "$index" | sponge "$index"
echo "$(date +%s) $file" >>"$index"
;;
(MOVED_FROM*|DELETE*)
grep -Fv " $file" "$index" | sponge "$index"
;;
esac
done
文件访问和修改会被忽略,不会更改索引;但是,如果重命名文件,其时间戳将被更新。
永远不需要索引sort
;我们只将新文件附加到索引的末尾并将其从中间删除。
inotifywait
,如脚本中调用的,监听文件事件,并输出事件类型、空格、导致事件的文件或目录的名称以及换行符。您可以用等效程序替换它。
sponge
只是将所有输入从 读stdin
入内部缓冲区,然后将其写入文件。您可以将其替换为等效项,或者将输出写入${index}.new
然后mv -f "${index}.new" "$index"
。
date +%s
将当前日期和时间输出为距纪元的秒数。此调用适用于 GNU 和 BSD date
。您可以更改格式(例如date '+%F %T'
)以获得人性化索引或将其替换date
为等效格式。
答案2
这应该有效,例如10小时前:
X=10; find /directory/ -type f -atime $X -exec echo rm -fv {} ';'
-atime 是“最后访问 n*24 小时前”,如果它能满足您的需要,请删除“echo”。
对于一小时前最后修改的文件,这更简单:
find . -mtime 1