我的文本文件列出了我的 Linux 系统上的许多文件,这些文件已被识别为需要删除。其中一些文件是在 Windows 上创建的并包含“1. '或'2。 ' (即句点后有文字空间)等等。
rm
如果我输入rm -f
带引号的文件名命令,该命令将删除它们。但是输入这个命令 700,000 次就不会发生这种情况。我尝试将“列表”文件输入到命令中,但它会跳过名称不规则的文件。
无论如何,是否可以将删除命令放入脚本中以自动方式执行?
答案1
我想你刚刚遇到了通常会告诉你的原因之一不解析输出ls
。
也就是说,如果您list.txt
包含要删除的文件名(每行一个),并且使用 Linux 风格的行尾,则以下方法也应该有效:
while IFS= read filename
do
rm "$filename"
done < list.txt
尽管建议您首先测试这一点(例如,通过使用创建虚拟文件touch "1. this is a first test.txt"
,touch "2. my second_file.bla"
然后创建list.txt
包含这些文件名的虚拟文件)。
您可以将上述代码包含在bash
脚本中,也可以直接在命令行中键入,这必须看起来行
user@host$ while IFS= read filename; do rm "$filename"; done < list.txt
答案2
可以使用?
(问号)作为通配符来完成交互式删除。例如
rm 1.?
将删除1.
缺点是它也会删除任何1.a
文件。
如果您的文件列表是 list.txt,每行一个文件,您可以使用
awk '{printf "rm \"%s\"\n",$0}' file.txt
生成命令
在哪里
$0
是整行(包括任何尾随或前导空格)
如果没问题,那么使用
awk '{printf "rm \"%s\"\n",$0}' file.txt |bash