我想通过删除许多子目录中的冗余文件来释放一些空间。但是我总是想保留文件主干的最后一个文件。例如,我有一个类似于以下的分类(在其他不应触及的文件旁边):
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 rm
在rm
您确信它会删除正确的文件时进行替换。