【问题标题】:Delete multiple files based on partial names list根据部分名称列表删除多个文件
【发布时间】:2018-03-07 17:16:35
【问题描述】:

我的 Red Hat 服务器上有一个文件夹,其中大约有一个文件夹。来自各种扩展名的 500k 个文件。 这些文件的命名约定基于一个数字,例如:

  • 一个123456.csv
  • z123456.jpg
  • 123456.exe
  • 一个234.jpg
  • 234.exe

我设计了一个查询,它会生成所有应该删除的数字列表。 假设我每天/每周将此列表导出到 txt 文件中,从列表中显示的文件夹中删除所有文件的最有效方法是什么?

在每个文件夹上运行 for 循环会花费很长时间,因为文件太多。我设法使用以下方法生成了要删除的所有数字的列表,这些数字在此文件夹中有文件:

join <(cat list.txt | sort) <(ls /folder/with/0.5Mfiles | grep -v html$ | sed 's/[a-zA-Z.]*//g' | sort)

但这样我会丢失原始文件名(例如 z123456.jpg)

最有效的方法是什么?

【问题讨论】:

  • 这听起来像是一个 XY 问题。 list.txt 中有什么?那是文件名列表还是数字列表?
  • 这是一个数字列表。

标签: join sed redhat comm


【解决方案1】:

怎么样

while read -r number; do
    echo rm /path/to/folder/*"$number"*
done < lists.txt

如果看起来不错,请删除“回声”


是的,当number=1234 时,模式将匹配a12345.jpg。让我们试试这个:

$ shopt -s extglob nullglob
$ touch 1234 a1234 1234b c1234d 12345 a12345 12345b c12345d
$ number=1234
$ echo ?(*[^0-9])"$number"?([^0-9]*)
1234 1234b a1234 c1234d

?(...) 形式可选 匹配包含的模式,我们使用*[^0-9][^0-9]* 添加“数字边界”——前面/后面的字符必须是非-数字。所以?(*[^0-9]) 匹配或者一个空字符串或者一个以非数字结尾的字符序列。

【讨论】:

  • 如果 1234 在 lists.txt - 12345.jpg 也将被删除
  • 在处理许多文件时使用一段时间太慢了,我正在尝试使用 xargs 提出解决方案
  • 那就是printf "%s\0" ?(*[^0-9])"$number"?([^0-9]*) | xargs -0 rm