【问题标题】:How to delete files from directory using CSV in bash如何在 bash 中使用 CSV 从目录中删除文件
【发布时间】:2018-11-08 11:34:36
【问题描述】:

我在一个目录中有 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

【问题讨论】:

    标签: bash csv find rm


    【解决方案1】:

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

    ls | grep -f unique-ids.csv
    

    如果该列表看起来正确,您可以使用以下命令删除文件:

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

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

    【讨论】:

    • 我试过了,我的 shell 基本上给了我一个无限闪烁的光标(从来没有给我任何输出)。这可能是因为我在 Windows 10 上使用 Git Bash。除了 Windows 上的二进制文件有点旧之外,我没有遇到太多麻烦。
    • 澄清一下:ls | grep -f unique-ids.csv 没有给我任何输出。
    • 这只是给了我一个 grep:内存耗尽代码:$ ls | grep -f journal.csv 36869456-0.jpeg ... grep: memory exhausted
    【解决方案2】:

    您可以将 IFS 变量设置为 ; 并循环读取读入数组的值:

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

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

    【讨论】:

    • 大家好,我知道这已经有一段时间了,但我正在使用它进行垃圾收集,直到现在我才真正需要它。我只是想确保这行得通。输出返回rm: cannot remove '1477187'$'\r''-*.jpeg': No such file or directory。谁能告诉我'$'\r'' 来自哪里?如果我能弄清楚如何从命令中删除该字符串,这将起作用。
    • @ihodonald:你在 MSWin 上创建了输入文件吗?只需在输入上运行 fromdosdos2unix 即可将其行尾转换为 *nix 行尾。
    【解决方案3】:

    您可以使用findsed

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

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

    【讨论】:

    • 我更新了答案。我假设ids.csv 是一个用分号分隔的单行文件。
    • 给我一点时间,我会试试这个。文件很多,很难确定一个真正需要删除的文件。
    • 我很抱歉。出于某种原因,我使用的程序(MySQL)应该创建一个以分号分隔的 CSV 文件,实际上并没有用分号分隔字段?:\ 很奇怪。我知道。不过,上面@choroba 给出的解决方案效果很好。我只是用“\n”替换了 IFS 变量中的分号。谢谢 如果我能弄清楚如何在带有 \n 分隔符的 CSV 上使用它,也许我会再试一次。
    • 我尝试使用 Sublime Text 手动插入分号,但是当我尝试在 50,000+ 行上插入分号时它冻结了。
    猜你喜欢
    • 2020-06-28
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2013-07-31
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多