如何删除目录中除最新的 10 个隐藏文件夹之外的所有文件夹

如何删除目录中除最新的 10 个隐藏文件夹之外的所有文件夹

我每次(重新)启动时都会将 .mozilla 备份到文件夹 ~/nas-backups/mozilla 中,但我只想按字母顺序保留最近的 10 个文件夹。备份以日期戳的形式存储,例如 .mozilla_2018_11_05_08:13

我想通过脚本删除除最近的 10 个文件之外的所有文件,但由于它们是隐藏文件,所以我找不到方法来实现:

rm -R 'ls -t | tail -n +11' 因为它会忽略隐藏的文件/文件夹。

我尝试过 rm -R 'ls -ta | tail -n +11' 但是它也不起作用。

如果它可以扩展,以便只保留每天的第一个备份,那将是一个好处。

我可以请求您对任何建议做出解释吗?谢谢。

请问有什么帮助吗?

答案1

  • 不适用于包含空格或换行符的名称。

  • 在您的情况下,名称类似于“ .mozilla_2018_11_05_08:13 ”。

  • 我推测主文件夹 ~/nas-backups/mozilla 中没有其他文件或文件夹

  • 发布前已测试:

    cd ~/nas-backups/mozilla
    total=$(ls -1A|wc -l); remove=$((total - 10)); rm -rv $(ls -1vA|head -n $remove)
    

解釋

total=$(ls -1A|wc -l) #total number of folders
remove=$((total - 10)) #total -10 so that 10 folders are not removed
rm -rv $(ls -1vA|head -n $remove) # removes total -10 from top(head)
# because older folders(by name) are first in ls -1vA (v switch lists the names 
# proper numeric order.

ls --help

-v 对文本中的(版本)数字进行自然排序

例子:

:~/nas-backups/mozilla$ ls -1vA
.mozilla_2019_01_09_01:16
.mozilla_2019_01_09_18:12
.mozilla_2019_01_09_18:16
.mozilla_2019_01_09_19:16
.mozilla_2019_01_09_20:16
.mozilla_2019_01_10_01:16
.mozilla_2019_01_10_18:12
.mozilla_2019_01_10_18:16
.mozilla_2019_01_10_19:16
.mozilla_2019_01_10_20:16
.mozilla_2019_02_09_02:16
.mozilla_2019_02_09_18:12
.mozilla_2019_02_09_18:16
.mozilla_2019_02_09_19:16
.mozilla_2019_02_09_20:16
.mozilla_2019_03_09_03:16
.mozilla_2019_03_09_18:12
.mozilla_2019_03_09_18:16
.mozilla_2019_03_09_19:16
.mozilla_2019_03_09_20:16
.mozilla_2019_03_10_03:16
.mozilla_2019_03_10_18:12
.mozilla_2019_03_10_18:16
.mozilla_2019_03_10_19:16
.mozilla_2019_03_10_20:16
:~/nas-backups/mozilla$ total=$(ls -1A|wc -l); remove=$((total - 10)); rm -rv $(ls -1vA|head -n $remove)
removed directory '.mozilla_2019_01_09_01:16'
removed directory '.mozilla_2019_01_09_18:12'
removed directory '.mozilla_2019_01_09_18:16'
removed directory '.mozilla_2019_01_09_19:16'
removed directory '.mozilla_2019_01_09_20:16'
removed directory '.mozilla_2019_01_10_01:16'
removed directory '.mozilla_2019_01_10_18:12'
removed directory '.mozilla_2019_01_10_18:16'
removed directory '.mozilla_2019_01_10_19:16'
removed directory '.mozilla_2019_01_10_20:16'
removed directory '.mozilla_2019_02_09_02:16'
removed directory '.mozilla_2019_02_09_18:12'
removed directory '.mozilla_2019_02_09_18:16'
removed directory '.mozilla_2019_02_09_19:16'
removed directory '.mozilla_2019_02_09_20:16'

答案2

尝试这个:

ls -tA|tail -n +11|xargs rm -R

这将通过一行简单的命令删除除最新的 10 个文件或文件夹(按文件修改时间)之外的所有文件或文件夹。

ls -tA列出所有文件,包括隐藏文件,但不包括...特殊文件,按修改时间排序(最新的在前)。

tail -n +11然后仅获取从第 11 个条目开始的文件(即,除最新的 10 个之外的所有文件)。

xargs只获取 tail 的输出并将其用作 rm 的参数(对 tail 中的每一行执行一次 rm)。对于不能使用简单管道的命令很有用。

相关内容