使用 find 删除子目录中除最后一个文件之外的所有文件

使用 find 删除子目录中除最后一个文件之外的所有文件

我想通过删除许多子目录中的冗余文件来释放一些空间。但是我总是想保留文件主干的最后一个文件。例如,我有一个类似于以下的分类(在其他不应触及的文件旁边):

FILE_1-1 FILE_1-2 FILE_1-3 FILE_2-1 FILE_2-2

在一大堆分支子目录中。我想保留FILE_2-2在这个实例中,但在另一个文件夹中它会是FILE_3-1或其他什么。始终是最后一个文件。我知道如何使用 find 命令很好地遍历子目录来摆脱所有这些:

find . -name "FILE_*" -type f -delete

FILE_*如何使用 find 命令排除每个目录中发生删除的最后一个?谷歌搜索(https://www.unix.com/shell-programming-and-scripting/36639-find-remove-all-but-latest-file.html) 得出了以下结论:

ls -1 FILE_* | sort -r | tail +2 | xargs -i rm {}

但是这个命令不适用于分支目录,不是吗?

答案1

在目录中,您可以找到“茎”:

ls * | sed -r 's/[0-9]+$//' | sort | uniq

对于每个词干,您可以列出最后一个词的所有文件:

ls  FILE_1-* | head -n -1

或者,如果您想保留最新的:

ls -rt FILE_1-* | head -n -1

这两个命令后面都可以| xargs rm删除它们的输出

将所有内容放入一个简短的脚本中(*)并运行:

find . -type d -exec {the_script} {} \;

(*) 简短的脚本如下所示:

#! /bin/bash
cd "$1"  # takes the directory as a parameter
for stem in $(ls FILE* | sed -r 's/[0-9]+$//' | sort | uniq)
do 
    ls -rt ${stem}* | head -n -1 | xargs echo rm 
done

当然,请彻底测试并echo rmrm您确信它会删除正确的文件时进行替换。

相关内容