bash 如何使用 CSV 从目录中删除文件

How to delete files from directory using CSV in bash

我在一个目录中有 600,000 多张图片。文件名如下所示:

1000000-0.jpeg
1000000-1.jpeg
1000000-2.jpeg
1000001-0.jpeg
1000002-0.jpeg
1000003-0.jpeg

第一个数字是唯一 ID,第二个数字是索引。

{unique-id}-{index}.jpeg

如何从 .CSV 文件加载 unique-id 并删除其唯一 ID 与 .CSV 文件中的唯一 ID 匹配的每个文件?

CSV 文件如下所示:

1000000
1000001
1000002

... 或者我可以像这样用分号分隔(如有必要):

1000000;1000001;1000002

如果每行只有一个 ID,这将显示所有匹配的文件名:

ls | grep -f unique-ids.csv

如果该列表看起来正确,您可以删除文件:

ls | grep -f unique-ids.csv | xargs rm

警告:这是一个快速而肮脏的解决方案。如果文件名都按照您所说的方式命名,它将起作用。当心它很容易被聪明的攻击者或特别倒霉的用户诱骗删除错误的东西。

您可以将 IFS 变量设置为 ; 并遍历读取到数组中的值:

#! /bin/bash
while IFS=';' read -a ids ; do
    for id in "${ids[@]}" ; do
        rm $id-*.jpg
    done
done < file.csv

首先使用 echo rm ... 尝试 运行 脚本以验证它是否符合您的要求。

您可以使用 findsed:

find dir -regextype posix-egrep \
         -regex ".*($(sed 's/\;/|/g' ids.csv))-[0-9][0-9]*\.jpeg"

dir 替换为您的搜索目录,并将 ids.csv 替换为您的 CVS 文件。要删除文件,您可以包含 -delete 选项。