【问题标题】:Removing files in a sub directory based on modification date [duplicate]根据修改日期删除子目录中的文件[重复]
【发布时间】:2014-06-29 02:34:54
【问题描述】:

嗨,如果文件数超过最大值,我会尝试从子目录中删除旧的备份文件,并且我发现此命令可以做到这一点

ls -t | sed -e '1,10d' | xargs -d '\n' rm

而我的改动如下

ls -t subdirectory | sed -e '1,$f' | xargs -d '\n' rm

显然,当我尝试运行脚本时,它给了我一个错误,提示未知命令:f

我现在唯一担心的是我将允许的最大文件数作为参数传递,因此我将其存储在 f 中,但现在我不太确定如何在上面的命令中使用该变量不必将条件设置为特定的数字。

任何人都可以给我任何指示吗?还有什么我做错了吗?

谢谢!

【问题讨论】:

    标签: linux bash shell ls


    【解决方案1】:

    您的问题标题为“基于修改日期”。那么为什么不简单地使用带有 mtime 选项的 find 呢?

    find subdirectory -mtime +5d -exec rm -v {} \;
    

    将删除所有超过 5 天的文件。

    【讨论】:

    • -delete 而不是-exec rm -v {} \;
    • 如果在目录中再添加一个文件时,当达到最大文件数时,我只想删除最旧的文件怎么办?对不起,我没有把问题说得很清楚
    【解决方案2】:

    问题在于您传递给xargs 的文件列表 包含删除文件所需的路径 信息。从当前目录调用时,不需要路径,但如果使用子目录调用,则需要从当前目录 rm subdirectory/file。试试看:

    ls -t subdirectory  # returns files with no path info
    

    您需要做的是更改到子目录,调用删除脚本,然后更改回来。可以用一行来完成:

    pushd subdirectory &>/dev/null; ls -t | sed -e '1,$f' | xargs -d '\n' rm; popd
    

    除了以类似的方式执行此操作外,您最好编写一个稍长且更灵活的脚本,使用find 命令形成文件列表,以确保保留路径信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多