我正在尝试为给定文件夹设置一种自动方式来删除其所有子文件夹,但最近创建的子文件夹除外。
例如,我想只保留 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
选项。