首页 > 解决方案 > 删除除最后一场比赛外的所有比赛

问题描述

我想删除file*目录中每个文件夹中存在的一组匹配文件的最后一个匹配项之外的所有匹配项。

例如:

Folder 1
    file
    file_1-1
    file_1-2
    file_2-1
    stuff.txt
    stuff
Folder 2
    file_1-1
    file_1-2
    file_1-3
    file_2-1
    file_2-2
    stuff.txt
Folder 3
    ...

等等。在每个子文件夹中,我只想保留最后一个匹配的文件,所以这Folder 1将是. 每个子文件夹中的文件数量通常不同。file_2-1Folder 2file_2-2

由于我有一个非常隐蔽的文件夹结构,我考虑过以find某种方式使用该命令

find . -type f -name "file*" -delete_all_but_last_match

我知道如何删除所有匹配项,但不知道如何排除最后一个匹配项。

我还找到了以下代码:

https://askubuntu.com/questions/1139051/how-to-delete-all-but-x-last-items-from-find

但是当我将修改后的版本应用到测试文件夹时

find . -type f -name "file*" -print0 | head -zn-1 | xargs -0 rm -rf

在大多数情况下,它会删除所有匹配项,仅在某些情况下保留最后一个文件。所以它对我不起作用,大概是因为每个文件夹中的文件数量不同。

编辑:

这些文件夹不包含其他子文件夹,但它们通常位于几个子文件夹级别的末尾。因此,如果脚本也可以在上面的某些级别上执行,那将是一个好处。

标签: bashfind

解决方案


#!/bin/bash
shopt -s globstar
for dir in **/; do 
    files=("$dir"file*)
    unset 'files[-1]'
    rm "${files[@]}"
done

推荐阅读