简单的bash脚本,用于从内容中带双引号的文件中读取

时间:2009-06-27 14:52:31

标签: bash whitespace

我真的很生气:( 我有一个名为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 个答案:

答案 0 :(得分:3)

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

并且,关于您的初始代码,请务必使用引号,直到您确实知道何时何地为止。

while read -r; do
  fname=${REPLY#\"}
  fname=${fname%\"}
  echo rm -f "$fname"
done < myfiles.txt

答案 1 :(得分:2)

以下单行应该这样做:

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

此处,tr将所有"转换为null(\0),其中输入来自名为test.txt的文件。最后,rm提供了结果。

以下Perl单行也可以用于同一个:

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

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

或者,

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

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

答案 2 :(得分:0)

快速编写一个快速的Perl脚本

#!/bin/perl

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

然后运行它:

./script.pl < test.txt

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

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

答案 3 :(得分:0)

我猜eval命令会为你做这件事:

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