2009-06-27 8 views
0

Eh bien je suis vraiment en rogne :(Je un fichier appelé test.txt et voici:.script bash simple à lire d'un fichier ayant des guillemets doubles dans le contenu

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

guillemets doubles sont inclus . dans le fichier chaque au début et à la fin du répertoire et je ne peux pas les enlever

je suis en train d'écrire un script pour supprimer les fichiers dans test.txt comme ceci:.

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

mais il ne fonctionne pas comme prévu :(

donne cette erreur:

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

Répondre

2

Le one-liner suivant devrait le faire:

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

Ici, tr traduit tout à " null (\0), où l'entrée provient du fichier test.txt. Enfin, rm est fourni avec les résultats.

Voici Perl one-liner peut être utilisé pour la même trop:

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

recherches et remplace " de la chaque ligne lue à partir test.txt. Ensuite, unlink supprime le fichier.

Ou,

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

espaces d'échappement, retirez " et supprimez le fichier.

+1

Il pourrait être utile d'expliquer ce qui précède pour le :-) non-initiés –

+0

Agnew @ Brian: Je l'ai fait. :-) –

+1

Pourquoi transformer les citations en valeurs NULL? Pourquoi ne pas supprimer les citations avec tr -d? – camh

0

Il est facile de concoctent un script Perl rapide

#!/bin/perl 

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

et l'exécuter ainsi:

./script.pl < test.txt 

Bien que vous avez spécifié bash dans ce qui précède, je ne sais pas si vous vraiment veulent une solution de bash seulement.

Notez que cela gérer les espaces blancs dans les noms de fichiers, etc.

3

Cela vient de supprimer le caractère de citation du début et la fin de l'entrée de lecture, ce qui est mieux que de supprimer aveuglément tous les guillemets (car ils peuvent apparaître dans les noms de fichiers, bien sûr). Et, en ce qui concerne votre code initial, VEUILLEZ TOUJOURS UTILISER DES CITATIONS jusqu'à ce que vous sachiez quand et quand.

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

Je suppose que la commande eval fera ce travail pour vous:

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