0

好吧,我真的很生气 :( 我有一个名为 test.txt 的文件。它是:

"/var/lib/backup.log"
"/var/lib/backup2.log"

双引号包含在目录的开头和结尾的文件中,我无法删除它们。

我正在尝试编写一个脚本来删除 test.txt 中的文件。像这样:

for del in `cat test.txt` ; do
rm -f $del
done

但它没有按预期工作:(

它给出了这个错误:

rm: cannot access "/var/lib/backup.log": No such file or directory
rm: cannot access "/var/lib/backup.log2": No such file or directory
4

4 回答 4

3

这只会从读取条目的开头和结尾删除引号字符,这比盲目删除所有引号字符要好(因为它们当然可以出现在文件名中)。

而且,关于您的初始代码,请始终使用引号,直到您真正知道什么时候什么时候不知道。

while read -r; do
  fname=${REPLY#\"}
  fname=${fname%\"}
  echo rm -f "$fname"
done < myfiles.txt
于 2009-06-27T21:40:14.920 回答
2

以下单行应该做到这一点:

rm $(tr '\"' '\0' < test.txt)

在这里,tr将 all 转换"为 null ( \0),其中输入来自名为 的文件test.txt。最后,rm提供结果。

以下 Perl one-liner 也可以用于相同的目的:

perl -nle 's{"}{}g;unlink' test.txt

"从读取的每一行中搜索和替换test.txt。然后,unlink删除该文件。

或者,

sed 's! !\\ !g' < test.txt | sed 's/"//g' | xargs rm

转义空格,删除"并删除文件。

于 2009-06-27T15:02:50.180 回答
0

快速编写 Perl 脚本很容易

#!/bin/perl

while (<STDIN>) {
   chomp;
   s/"//g;
   unlink $_;
}

并运行它:

./script.pl < test.txt

尽管您在上面指定了 bash,但我不确定您是否真的想要一个仅 bash 的解决方案。

请注意,这将处理文件名等中的空格。

于 2009-06-27T15:42:29.087 回答
0

我猜eval命令会为你做这个工作:

for del in `cat test.txt` ; do
  eval rm -f $del
done
于 2014-02-18T13:00:58.333 回答