查找命令输出进行排序然后删除

查找命令输出进行排序然后删除

我想根据路径中的某种模式找到一些文件,然后我只想保留该模式的 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可以使用扩展表达式,例如*.shorhello*.sh*hello.sh等。

请注意,上述命令将删除除 3 之外的所有文件,请使用该命令sort根据需要对文件进行排序(使用大小、创建或修改日期):

FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")

相关内容