因此,我有一个文件,其中包含需要从各个目录中删除的数百个文件的列表。我认为最简单的方法是创建一个批处理文件,但我没有取得很大的成功。
#/bin/bash
rm "/home/e-smith/files/users/bill/Maildir/cur/1392373930.28512.comp01:2,S"
rm "/home/e-smith/files/users/ted/Maildir/cur/1420726198.17690.comp01:2,S"
但是当我运行脚本时
./myfile.txt
我明白了
rm: cannot remove '/home/e-smith/files/users/bill/Maildir/cur/1392373930.28512.comp01:2,S\r': no such file or directory
rm: cannot remove '/home/e-smith/files/users/ted/Maildir/cur/1420726198.17690.comp01:2,S\r': no such file or directory
我不明白它\r
来自哪里,我猜它是一个回车符,但它会将其自身附加到命令中。
像这样的练习的正确方法/语法是什么?
答案1
这是由于 Windows 使用的行结束符 ( \r\n
) 造成的。
您可以通过以下方式删除它们vi
:
$ vi myfile.txt
<ESC>
:set fileformat=unix
:wq
答案2
如果您有数百个文件名的列表并且想要删除它们,则没有理由rm
为每个文件名编写单独的命令。假设您的文件名保存在名为 的文件中list.txt
,每行一个,并且它们不包含换行符,你可以这样做
while read -r file; do rm "$file"; done < list.txt
解释
- 该
while read variable; do something; done < file
构造将从文件中读取每一行并将其保存为variable
(在上面的示例中,变量的名称是file
)。需要-r
允许文件名包含诸如\r
或 之类的内容\t
。使用 时,-r
它们将按字面意思处理,而不使用时,它们将分别扩展为回车符或制表符。 rm "$file"
:这将在读取时删除列表中的每个文件。
或者,您可以使用 bash 的mapfile
内置函数,它可以将文件的行保存在数组中:
mapfile -t filelist < list.txt && rm "${filelist[@]}"
答案3
感谢您的回复,其技术原因可能是在某个地方的文件编码中,但为了解决这个问题,我只是在 CentOS 机器上创建了我的文件
$> touch myfile.txt
$> nano myfile.txt
添加了“!”进入我的 bash 脚本(感谢@jimmij)
#!/bin/bash
保存后,我在 Windows 上使用 notepad++ 添加我想要根据我的初始语法和宾果删除的文件。
感谢@Marko Frelih、@jimmij 的建议
答案4
xargs 会做“某事”,并列出某事的列表......
cat file_containing_list_of_files_to_delete.txt | xargs rm
制作一个文件
touch file1
查看这个名为 foo 的文件
cat foo
file1
file2
file3
删除文件 foo 中提到的文件。
cat foo | xargs rm
rm: cannot remove `file2': No such file or directory
rm: cannot remove `file3': No such file or directory
file1 现在消失了。
ls file1
ls: cannot access file1: No such file or directory