Linux-仅保存最近的10个文件夹并删除其余文件夹
我有一个包含我的应用程序版本的文件夹,每次我上传一个新版本时,都会为其创建一个子文件夹,子文件夹名称是当前时间戳,下面是所用主文件夹的打印输出(ls-l | grep^d): 我正在寻找一个命令,它将保留最后10个版本(子文件夹)并删除其余版本 有什么想法吗?编辑:Linux-仅保存最近的10个文件夹并删除其余文件夹,linux,bash,shell,Linux,Bash,Shell,我有一个包含我的应用程序版本的文件夹,每次我上传一个新版本时,都会为其创建一个子文件夹,子文件夹名称是当前时间戳,下面是所用主文件夹的打印输出(ls-l | grep^d): 我正在寻找一个命令,它将保留最后10个版本(子文件夹)并删除其余版本 有什么想法吗?编辑: find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf 好了(已编辑) ls-dt*/| tail-n+11 | xar
find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf
好了(已编辑)
ls-dt*/| tail-n+11 | xargs-rm-rf
首先列出最近修改过的目录,然后将除前10个之外的所有目录发送到
rm-rf
您的目录名按时间顺序排序,这使操作变得简单。按时间顺序排列的目录列表只是*
,或者更准确地说是[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
。因此,您希望删除除最后10个之外的所有对象
set [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
while [ $# -gt 10 ]; do
rm -rf "$1"
shift
fi
(剩下的目录超过10个,请删除最旧的目录。)
说明:
- 按时间顺序列出当前目录的所有内容(首先列出最近的文件)
- 过滤掉所有目录
- 忽略前10行/目录
- 使用awk从剩余的“ls-l”输出中提取文件名
- 删除这些文件
通常只打印最新目录,而ls-dt1
将 仅匹配目录并打印其完整路径/*/
确保一个 每匹配一行/列表1
将时间排序为最新t
将第11行向下移到底部,只打印这些行,然后将这些行传递到sed
rm
您可以使用xargs,但对于测试,您可能希望删除
| rm-r
,以查看目录是否首先正确列出 如果目录名包含日期,则可以使用默认字母排序删除除最后10个目录外的所有目录
ls -d */ | head -n -10 | xargs rm -rf
我得到:rm:无法删除目录:`。'Whoa!首先,
ls-dt
仅输出
。第二,如果您将其更正为ls-t
,您将删除10个最新的文件,这与要求的完全相反。第三,如果存在除所考虑的目录以外的文件,那么脚本将愉快地删除随机内容。第四,如果有“奇怪”的文件名,你的脚本可以做任何事情,因为你正在解析ls
的输出,并且你正在将未准备好的输入传递给。等一下,我注意到你想保留前10个并删除所有其他文件名,我认为你需要删除前10个。嗯,你的错误很有意思。我想把最新的10.5秒修正。Grep和sed会变慢,ls-d
会更快。(与其他解决方案相比)。而且tail+10
也将删除第10条记录。因此,tail+11
更好。我认为应该是:ls-l | grep^d | tac | sed-e'1,10d'| xargs rm-rf您正在解析ls
的输出,并且您正在将未准备好的输入传递给。你的grep^d
没有做你认为它在做的事情-如果你有ls-l
,你需要提取文件名(这不是一个好主意),但是因为你没有,所以没有目录指示器。是的,那是垃圾。我的错。
ls -lt | grep ^d | sed -e '1,10d' | awk '{sub(/.* /, ""); print }' | xargs rm -rf
ls -dt1 /path/to/folder/*/ | sed '11,$p' | rm -r
ls -d */ | head -n -10 | xargs rm -rf