Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 从文本文件的列表中删除文件_Unix_Delete File_Rm - Fatal编程技术网

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

Unix 从文本文件的列表中删除文件,unix,delete-file,rm,Unix,Delete File,Rm,我有一个包含大约500行的文本文件。每一行都是文件的绝对路径。我想用脚本删除这些文件 有一个建议,但我的文件中有空格。他们接受了\治疗以逃离空间,但仍然不起作用。在这条线索上有关于空白问题的讨论,但没有解决方案 我不能简单地使用find命令,因为这不会给出准确的结果,我需要使用列表(通过运行find并编辑差异来创建) 编辑:一些上下文。我注意到iTunes重新下载并复制了多首歌曲,并将它们放在与原始歌曲相同的目录中,例如,在特定的专辑目录中有“01 This Song.aac”和“01 This

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

有一个建议,但我的文件中有空格。他们接受了
\
治疗以逃离空间,但仍然不起作用。在这条线索上有关于空白问题的讨论,但没有解决方案

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

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

我运行了一个
find
生成一个文本文件,其中所有歌曲都匹配“*1.*”,以1结尾,但任何文件类型的歌曲都可以。我在我的iTunes媒体/音乐目录中运行了这个

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


我留下的文件大约有500行,其中包含歌曲,所有的歌曲都包含文件名中的空格。因为这是iTunes的问题,一个目录中只有几首歌曲,另一个目录中有更多歌曲,等等——我不能只在一个目录中运行脚本,它必须递归地工作,只在我的列表中命名的文件上运行。txt

要删除名为空格的文件,您可以将整个路径用引号括起来。
要删除文件列表,我建议更改文件的每一行,使其看起来像
rm
call。最快的方法是使用
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脚本执行。

正如您所期望的,诀窍是正确引用:

while read line; do rm "$line"; done < filename
读行时
;请输入rm“$line”;完成<文件名

运行此命令将创建newfile.sh,该命令为空,并返回:“:替换模式中未替换的换行符hmm,它会按照您所说的方式填充newfile.sh,但运行时我得到:“./newfile.sh:line 21:语法错误:文件意外结束”。第21行是脚本的最后一行(空)。此外,不会删除文件。(顺便说一句,我在一个测试目录上运行,因此只有21行!)啊,是的。它不应该是双符号和
&&
,而是分号
。我会更新答案。这次应该有效……我希望=)工作得很好。我给了@Alex L“官方”答案,但只是因为它是一行,所以效率更高。谢谢你的帮助!我该怎么办?它去哪里了?我应该用我的特定属性(文本文件名等)替换哪些部分?很抱歉没有说得更清楚。我假设“文件名”“是包含大约500行的文本文件的名称。如果文件名为“foo.txt”,则用“foo.txt”替换文件名。我给出的代码片段可以输入(或复制粘贴)到终端窗口中。它一次读取一行文件,并以保留内部空格字符的方式删除以其读取内容命名的文件。