如何知道某个文件在目录中保存了多长时间?

如何知道某个文件在目录中保存了多长时间?

我想查找(并删除)目录中已存在超过 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

相关内容