根据部分名称列表删除多个文件

时间:2017-09-26 12:53:55

标签: join sed redhat comm

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

  • a 123456 .csv
  • ž的 123456 .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)

最有效的方法是什么?

1 个答案:

答案 0 :(得分:0)

怎么样

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

如果看起来没问题,请删除“echo”

是的,当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])匹配 空字符串以非数字结尾的字符序列。