从文本文件的列表中删除文件

Delete files from a list in a text file

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

有一个建议 here 但我的文件中有 space。他们已经用 \ 处理以逃避 space 但它仍然不起作用。该线程上有关于白色 space 问题的讨论,但没有解决方案。

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

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

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

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

我剩下的文件大约有 500 行歌曲,文件名中都包含 spaces。因为这是一个 iTunes 问题,一个目录中只有几首歌曲,然后是另一个目录中的更多歌曲,然后是另一个目录,依此类推——我不能只 运行 一个目录中的脚本,它必须工作递归且 运行 仅在我的 list.txt

中命名的文件上

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

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

单行本应该是这样的:

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 脚本执行。

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

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