制作一个文件

制作一个文件

因此,我有一个文件,其中包含需要从各个目录中删除的数百个文件的列表。我认为最简单的方法是创建一个批处理文件,但我没有取得很大的成功。

#/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

相关内容