让我们说我有几个目录,虽然它们相似但最后却略有不同:
XYZ_e6586_e5984
XYZ_e3282_e5984
XYZ_e9823_e5984
现在,如果存在两个或两个以上名称相同的目录,但e
和_
之间的数字相同,则仅保留编号最大的目录。在这种情况下,XYZ_e6586_e5984
和XYZ_e3282_e5984
应该被删除。我该怎么办?
让我们说我有几个目录,虽然它们相似但最后却略有不同:
XYZ_e6586_e5984
XYZ_e3282_e5984
XYZ_e9823_e5984
现在,如果存在两个或两个以上名称相同的目录,但e
和_
之间的数字相同,则仅保留编号最大的目录。在这种情况下,XYZ_e6586_e5984
和XYZ_e3282_e5984
应该被删除。我该怎么办?
在这里简单找到正则表达式案例:
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
。