如何将最旧的文件保留在同一目录中

如何将最旧的文件保留在同一目录中

我有 2 个目录“../in/”和“../temp/”。我的问题是如何编写 bash 脚本以将最旧的文件或目录保留在同一个 ../in/ 目录中,并移动剩余的文件或目录到 ../temp/ 目录。

答案1

如果可以假设文件名中没有空格或换行符,则可以使用更简单的方法来执行此操作。在现代世界中,人们不能假设这一点,此外,编写如此脆弱的脚本是一种不好的形式,以至于如果找到这样的合法文件名,脚本就会失败。

为了安全起见,请使用以下命令(可能需要 GNU 工具):

find ../ini/ -type f -printf '%T@ %p\0' | sort -nz | sed -Ezn '2,$s/[^ ]* //p' | xargs --null mv -t ../temp/

这会将除最旧文件之外的所有文件../ini/移至../temp/.

怎么运行的

  • find ../ini/ -type f

    这会找到目录中的所有常规文件../ini

  • -printf '%T@ %p\0'

    这会打印在以 null 分隔的字符串中找到的文件的时间戳和名称。

  • sort -nz

    这对以 null 分隔的字符串进行数字排序。完成此操作后,最旧的文件将首先列出。

  • sed -Ezn '2,$s/[^ ]* //p'

    这将打印除第一个文件之外的所有文件名。它还删除了时间戳。

  • xargs --null mv -t ../temp/

    这会对mv这些文件执行命令,将它们发送到../temp/目录。

使用不支持 NULL 分隔项的工具

上述假设的工具支持\0单独的项目。现代版本的 Linux (GNU) 确实支持这一点。当使用不支持的操作系统时,有多种解决方法。以下使用换行符分隔的项目,因此应该与旧工具兼容:

find ../ini/ -type f -printf '%T@ %p\n' | sort -n | sed -En '2,$s/[^ ]* //p' | xargs -d'\n' mv -t ../temp/

如果任何文件的名称包含换行符,此操作将会失败。

相关内容