查找并删除子文件夹,仅保留最新的子文件夹

查找并删除子文件夹,仅保留最新的子文件夹

我正在尝试为给定文件夹设置一种自动方式来删除其所有子文件夹,但最近创建的子文件夹除外。

例如,我想只保留 3 个最近的子文件夹,并删除所有其他子文件夹。

想象一下给定的文件夹:

/some/specific/folder
    /subfolder1
    /subfolder2
    /subfolder3
    /subfolder4
    /subfolder5
    /subfolder6
    /subfolder7
    /subfolder8
    /subfolder9
    /subfolder10

我想删除所有子文件夹,但保留subfolder8,subfolder9并且subfolder10...

现在,我设法列出了我想要保留的文件,但如何在 shell 命令中“反转”它?

cd /some/specific/folder/
ls -tr | head -3

# Gives the following result
subfolder8
subfolder9
subfolder10

# And I am looking for the following :
subfolder1
subfolder2
subfolder3
subfolder4
subfolder5
subfolder6
subfolder7

任何想法?

答案1

如果ls -tr | head -3 为您提供了要保留的正确 3 个文件夹,则将ls -tr | tail -n +4为您提供所有其他文件夹(它会跳过前 3 行)。

答案2

zsh

cd /some/specific/folder && echo rm -rf -- *(/n[1,-4])

/将按数字 ( n) 排序顺序删除除最后 3 个文件夹 ( ) 之外的所有文件夹(其中subfolder10排序 subfolder2),不包括隐藏的。

删除echo即可实际执行操作。

请注意,许多系统上都没有记录创建时间,即使记录了(例如最近的 Linux),也没有简单的方法来检索它。您可以依赖的只是上次修改的时间(输出中显示的日期ls -l)。

要删除除最后 3 个最近修改的之外的所有内容,仍使用zsh

cd /some/specific/folder && echo rm -rf -- *(/Om[1,-4])

Om按修改时间倒序(从最旧的到最新的,例如ls -tr)。

如果您没有或无法安装,zsh但使用的是最新的 GNU 系统,您可以这样做:

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
    sort -rnz |
    tail -zn +4 |
    cut -zf 2- |
    xargs -r0 echo rm -rf --)

对于较新的 GNU 系统(-z最近才添加到其中一些实用程序中):

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
    tr '\n\0' '\0\n' |
    sort -rn |
    tail -n +4 |
    cut -f 2- |
    tr '\0\n' '\n\0' |
    xargs -r0 echo rm -rf --)

如果目录中的文件名都不包含换行符、空格、引号或反斜杠,您还可以执行以下操作:

cd /some/specific/folder &&
  ls -pt | grep '/$' | tail -n +4 | xargs echo rm -rf --

zsh对于像s 这样的数字排序*(n),另请参见 GNUls -v选项。

相关内容