2009-06-27 3 views
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 

ответ

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 

Побег пространства, удалить " и удалить файл.

+1

Это может быть полезно, чтобы объяснить выше для непосвященных :-) –

+0

@ Брайан Agnew: Я сделал это. :-) –

+1

Зачем ставить котировки в нули? Почему бы не просто удалить кавычки с tr -d – camh

0

Легко шелестеть быстрый скрипт на языке Perl

#!/bin/perl 

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

и запустить его таким образом:

./script.pl < test.txt 

Хотя вы указали Баш в выше, я не уверен, если вы действительно хотят только bash-решение.

Обратите внимание, что это будет обрабатывать пробельные в именах файлов и т.д.

3

Это просто удалить кавычку с самого начала и конца записи для чтения, которая лучше, чем слепо удаляя все кавычки (так как они могут появляются в именах файлов, конечно).

И, в отношении вашего исходного кода, ПОЖАЛУЙСТА, ВСЕГДА ИСПОЛЬЗУЙТЕ ЦИТАТЫ, пока вы действительно не узнаете, когда и когда нет.

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

Я думаю eval команда будет делать эту работу за вас:

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

 Смежные вопросы

  • Нет связанных вопросов^_^