【问题标题】:Delete files from a list in a text file从文本文件的列表中删除文件
【发布时间】:2017-03-08 15:13:02
【问题描述】:

我有一个包含大约 500 行的文本文件。每行都是文件的绝对路径。我想使用脚本删除这些文件。

有一个建议here,但我的文件中有空格。他们已经用\ 处理以逃离空间,但它仍然不起作用。有关于空白问题的讨论,但没有解决方案。

我不能简单地使用find 命令,因为这不会给我准确的结果,我需要使用列表(通过运行find 并编辑出差异来创建)。

编辑:一些上下文。我注意到iTunes已经重新下载并复制了多首歌曲并将它们与原始歌曲放在同一目录中,例如,在特定专辑目录中是'01 This Song.aac'和'01 This Song 1.aac'。

我运行find 来生成一个文本文件,其中包含所有匹配“* 1.*”的歌曲,以获取以 1 结尾但任何文件类型的歌曲。我在我的 iTunes Media/Music 目录中运行了它。

文件中包含的其中一些歌曲的编号为 1,但实际上并不是重复的(环境的受害者),所以我手动删除了它们。

我留下的文件大约有 500 行,其中的歌曲都包括文件名中的空格。因为这是一个 iTunes 问题,所以一个目录中只有几首歌曲,然后在另一个目录中更多,然后是另一个,依此类推——我不能只在单个目录上运行脚本,它必须递归工作并且只运行在我的 list.txt 中命名的文件上

【问题讨论】:

    标签: unix delete-file rm


    【解决方案1】:

    如您所料,诀窍是正确引用:

    while read line; do rm "$line"; done < filename
    

    【讨论】:

    • 我该怎么办?它去哪儿了?我应该用我的特定属性(文本文件的名称等)替换哪些部分?
    • 抱歉没说清楚。我假设“文件名”是包含大约 500 行的文本文件的名称。如果文件名为“foo.txt”,则用“foo.txt”替换文件名。我提供的代码 sn-p 可以输入(或复制并粘贴)到终端窗口中。它一次读取一行文件,并删除以它读取的内容命名的文件,以保留内部空格字符。
    【解决方案2】:

    要删除名称中包含空格的文件,您只需将整个路径用引号括起来即可。
    要删除文件列表,我建议更改文件的每一行,使其看起来像 rm 调用。最快的方法是使用sed。因此,如果您的文件采用以下格式:

    /home/path/file name.asd
    /opt/some/string/another name.wasd
    ...
    

    oneliner 是这样的:

    sed -e 's/^/rm -f "/' file.txt | sed -e 's/$/" ;/' > newfile.sh
    

    第一个sed 将行首替换为rm -f ",第二个sed 将行尾替换为" ;

    它将生成具有以下内容的文件:

    rm -rf "/home/path/file name.asd" ;
    rm -rf "/opt/some/string/another name.wasd" ;
    ...
    

    因此,您可以将该文件作为 bash 脚本执行。

    【讨论】:

    • 运行它会创建 newfile.sh,它是空的,并返回:“:替代模式中的未转义换行符
    • 嗯,它以您所说的方式填充 newfile.sh,但运行时我得到:“./newfile.sh: 第 21 行:语法错误:文件意外结束”。第 21 行是脚本的最后一行(空)。此外,文件不会被删除。 (顺便说一句,我在测试目录上运行,因此只有 21 行!)
    • 啊,是的。它不应该是双与号&amp;&amp;,而是分号;。我会更新答案。这次应该可以了...我希望=)
    • 效果很好。我向@Alex L 给出了“官方”答案,但这只是因为它是单行的,所以效率更高。感谢您的帮助!
    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2017-06-21
    • 2015-07-30
    • 2015-12-21
    相关资源
    最近更新 更多