2012-03-30 22 views
2

Ich versuche Songs über eine Bash-Shell for-Schleife noch Entfernen einer Datei wie dieseWie kann man Sonderzeichen umgehen?

while read item; do rm "$item"; done < duplicates 

wird immer gefangen auf Song-Namen zu entfernen. Ist es möglich, das zu umgehen? Meine Songtitel könnten wie folgt aussehen:

/home/user/Music/Master List's Music/iTunes/iTunes\ Music/John\ Mayer/Room\ for\ Squares\ \[Aware\]/07\ 83.m4a 
/home/user/Music/Master List's Music/bsg\ season\ 1\ \(Case\ Conflict\ 1\)/06\ A\ Good\ Lighter.mp3 
/home/user/Music/Master List's Music/Nino\ Rota/The\ Godfather\ Pt.\ 3/14\ A\ Casa\ Amiche.m4a 

wie Sie sehen können, um einen Artikel zu entfernen ich kein% haben kann() [] oder irgendetwas anderes, ohne entkommen lassen, wenn sie das ist.. vor der Dateierweiterung natürlich. Gibt es einen Weg, Sondercharakteren wie diesem zu entkommen?

Zum Beispiel habe ich sed die% 20 in die Räume zu verwandeln:

cat duplicates | sed 's/%20/\\ /g' > clean_duplicates 

Der Ausgang Ich bin für aussieht wie folgt aussehen:

/home/user/Music/Master\ List\'s\ Music/iTunes/iTunes Music/John\ Mayer/Room\ for\ Squares\ \[Aware\]/07\ 83.m4a 
/home/user/Music/Master\ List\'s\ Music/bsg\ season\ 1\ \(Case\ Conflict\ 1\)/06\ A\ Good\ Lighter.mp3 
/home/user/Music/Master\ List\'s\ Music/Nino\ Rota/The Godfather\ Pt\.\ 3\/14\ A\ Casa\ Amiche.m4a 
+0

Können Sie sicher sein, dass zwei Dateien 'foo% 20bar' und' foo bar' wirklich Duplikate sind? I.e. genau die selbe Datei, damit du 'foo% 20bar' getrost wegblasen kannst ohne etwas zu verlieren? – Kaz

+0

Oder sagen Sie, dass die Duplikatdatei prozentcodierte Namen enthält, aber die Dateien im Dateisystem nicht solche Namen haben? – Kaz

+0

@Kaz, eine solide Frage ... Ich benutze Banshee Banshee.db-Datei, die bereits alles indiziert hat und diese Dateinamen, die ich aufgelistet habe, sind eigentlich die URI in einer Tabelle mit allen Spuren. –

Antwort

2

aktualisieren die tatsächliche zu adressieren url-decoding (Ich habe es vorher verpasst):

while read line; do printf "$(echo -n $line | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')\n"; done < input 

Ausgabe:

/home/user/Music/Master List's Music/iTunes/iTunes Music/John Mayer/Room for Squares [Aware]/07 83.m4a 
/home/user/Music/Master List's Music/bsg season 1 (Case Conflict 1)/06 A Good Lighter.mp3 
/home/user/Music/Master List's Music/Nino Rota/The Godfather Pt. 3/14 A Casa Amiche.m4a 

Um diese Dateien zu löschen, z.B. umleiten die gereinigte Ausgabe in eine Datei:

while read line 
do 
    printf "$(echo -n $line | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')\n" 
done <duplicates> cleaned_duplicates 

while read file; do rm -v "$file"; done < cleaned_duplicates 

Wenn Sie die Namen in ein Skript-Dateien mit explizite Shell Zeichen speichern bevorzugen entkommen Sie

while read file; do printf "rm -v %q\n" "$file"; done <cleaned_duplicates> script.sh 

tun könnte, die in script.sh führen sollte enthalten:

rm -v /home/user/Music/Master\ List\'s\ Music/iTunes/iTunes\ Music/John\ Mayer/R 
rm -v /home/user/Music/Master\ List\'s\ Music/bsg\ season\ 1\ \(Case\ Conflict\ 
rm -v /home/user/Music/Master\ List\'s\ Music/Nino\ Rota/The\ Godfather\ Pt.\ 3/ 
+0

Die Antwort jetzt behoben :) – sehe

+0

Ich lief auf zwei Arten, 1. was Sie oben geschrieben und es schien viele Zeilen vor dem Absturz meines Terminals und 2. nur Ihre sed Befehl läuft und es schien, dass der einzige Unterschied war % 20 wurde durch \ x20 und so weiter ersetzt. –

+0

Um Kopier-/Einfügefehler auszuschließen, habe ich die Zeile so kopiert, wie ich sie in meinem Verlauf habe: das funktioniert bei mir :) – sehe

Verwandte Themen