我想根据路径中的某种模式找到一些文件,然后我只想保留该模式的 3 个最新文件以及我想删除的其他文件。
答案1
和zsh
:
echo rm -f ./**/*pattern*(.Dom[4,-1])
**/
任何级别的子目录(...)
glob 限定符根据其他标准来限定匹配:.
:仅限常规文件D
:包括点文件(隐藏文件)并查看隐藏目录om
:按修改时间排序(从新到旧)[4,-1]
:从第 4个到最后一个(因此跳过前 3 个)。
(删除echo
以实际执行)
对于使用任何 POSIX shell 和 GNU 实用程序的等效项:
(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p\0' |
sort -zrn |
tail -zn +4 |
cut -zd/ -f2- |
xargs -r0 echo rm -f)
(删除echo
以实际执行)
使用旧版本的 GNU 实用程序,您可能需要:
(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p\0' |
tr '\n\0' '\0\n' |
sort -rn |
tail -n +4 |
cut -d/ -f2- |
tr '\n\0' '\0\n' |
xargs -r0 echo rm -f)
答案2
好吧,排序需要围绕它的逻辑,但到目前为止:
# 使用您想要定位的文件创建一个数组 文件=$(查找${PATH_TO_FOLDER} -type f -name "whatever.whatever") # 获取数组的总大小 总大小=${#FILES[@]} # 从总大小中减去 3 以创建阈值 停止=((${totalSize}-3)) # 声明一个计数器为 0 计数器=0 # 逐个迭代数组中的文件 对于“${FILES[@]}”中的文件 做 # 确保执行此操作直到剩下 3 个文件 while [ ${counter} -le ${stopat} ] 做 rm -v ${文件} ((计数器++)) 完毕 完毕
使用时-name
可以使用扩展表达式,例如*.sh
orhello*.sh
或*hello.sh
等。
请注意,上述命令将删除除 3 之外的所有文件,请使用该命令sort
根据需要对文件进行排序(使用大小、创建或修改日期):
FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")