2012-03-30 15 views
2

私は、まだこの特殊文字をエスケープする方法は?

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

のようなファイルを削除するループのbashシェル経由で曲を削除しようとしている曲の名前に巻き込ま続けます。これを回避することは可能ですか?あなたは私が何%を持つことはできませんアイテムを削除するために、見ることができるよう

/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 

()[]または何か、それはでない限りエスケープされずに:私の曲のタイトルは次のようになります。明らかにファイル拡張子の前に。このような特殊文字を逃れる方法はありますか?例えば

、私はスペースに20%を回すためにsedを使用:

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

私はこのようなルックスを探しています出力:

/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

次の2つのファイル 'fooという%の20bar'と' FOOのbar'が本当に重複していることを確認することができますか?私。まったく同じファイルなので、何も失うことなく確実に 'foo%20bar'を吹き飛ばすことができます。 – Kaz

+0

重複ファイルにパーセントエンコードされた名前が含まれていると言っていますが、ファイルシステム内のファイルにそのような名前はありませんか? – Kaz

+0

@Kaz、確かな質問...私はbansheeのbanshee.dbファイルを使用しています。これはすでにすべてをインデックスしています。リストにあるファイル名は、実際にはすべてのトラックを含むテーブルのURIです。 –

答えて

2

更新は実際に対処するためにURLデコード(私はこれまで逃した):

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 

出力:

/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 

これらのファイルを削除するには、次のようにします。あなたが含むscript.shを生じるはずである

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

を行うことができ脱出明示シェル文字を使用して、スクリプトファイルに名前を格納することを好む場合

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 

:ファイルに掃除出力をリダイレクトします。

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

今答えを修正しました:) – sehe

+0

私は2つの方法であなたを走らせました.1あなたが上に書いたものと、それが私の端末をクラッシュさせる前にたくさんの行をエコーし​​ているように見えました.2あなたのsedコマンドを実行していました。 %20は\ x20に置き換えられました。 –

+0

コピー/ペーストエラーを除外するには、私の履歴に実際にあるように行をコピーしました。それは私にとっては役に立ちます:) – sehe

関連する問題