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