在bash中删除带有条件的类似目录

让我们说我有几个目录,虽然它们相似但最后却略有不同:

XYZ_e6586_e5984
XYZ_e3282_e5984
XYZ_e9823_e5984

现在,如果存在两个或两个以上名称相同的目录,但e_之间的数字相同,则仅保留编号最大的目录。在这种情况下,XYZ_e6586_e5984XYZ_e3282_e5984应该被删除。我该怎么办?

skfywj 回答:在bash中删除带有条件的类似目录

在这里简单找到正则表达式案例:

find /directory -mindepth 1 -maxdepth 1 -type d -regextype sed -regex "XYZ_e[0-9]\{4}\_e5984 -print0" | sort -nr | tail -n +2 | xargs -i -0 rm -rf "{}"

但是,这仅适用于具有GNU find的Linux。更加便携但不太漂亮的版本是

find /directory -mindepth 1 -maxdepth 1 -type d -regextype sed -regex "XYZ_e[0-9][0-9][0-9][0-9]_e5984" | sort -nr | tail -n +2 | xargs -i rm -rf "{}"

说明:

使用-mindepth 1 and -maxdepth 1仅搜索/ directory的直接子级。

-type -d仅指定搜索目录。

在这种情况下,正则表达式很容易解释。

-print0有助于处理特殊字符

sort -nr按从高到低的顺序对输出进行数字排序

tail -n +2跳过第一行(即要保留的编号最高的文件夹)

xargs -i rm -rf "{}"执行实际的删除操作(由于-print0,所以必须为-0)。

只需确保正确完成反向排序(将xargs -i rm -rf "{}"替换为echo "xargs -i rm -rf \"{}\""即可显示将要执行的实际命令。

如果排序不正确,请在执行命令之前尝试 export LANG=C

本文链接:https://www.f2er.com/3106840.html

大家都在问