$ VAR値には既にバックティックおよび/または一重引用符が含まれています。それを処理する方法? $VARをプログラムに正しく渡すにはどうすればよいですか? [コピー]

$ VAR値には既にバックティックおよび/または一重引用符が含まれています。それを処理する方法? $VARをプログラムに正しく渡すにはどうすればよいですか? [コピー]
$ bash --version
GNU bash, versione 5.2.26(1)-release (x86_64-pc-linux-gnu)

どう対処すべきかわかりません。$VAR内部値に一重引用符(')および/または逆引用符(`)が含まれている場合。

実行する必要があります探す-execの項目に基づいていますlist.txt

list.txt含む:

  • 一つファイル名.EXT各ライン
  • 各行は次から始まります。新しいチーム( \n)

すべてが正しく機能していることを確認するための予防テストとして、次のコマンドを実行しました。

$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name "$song"; done < list.txt
$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name "*$song*"; done < list.txt
$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name '$song'; done < list.txt
$ while IFS= read -r song; do find /mnt/EXTHDD/unsorted -type f -name "${song}"; done < list.txt

それらのどれも働かなかった...

残念ながら、特殊文字のためにすべての項目がリストされているわけではありません。ファイル名したがって、$song変数を正しく引用できません(二重引用符または一重引用符を使用)。

ラインの例ファイル名.EXT以下に見つかりましたlist.txt

Pino Daniele ~ [2000] Napul`e' - Raccolta completa ~ 01.14) `O ssaje comme fa `o core.mp3
[CONCERTI] Malora -- Live@TANT`E'! (Agosto '05, Villa Fossa` [presa diretta, mixer:stereo]) -- #15. 20:30 ... Tutto tace?.wave

答え1

ここでの問題は、一重引用符(')および/または逆引用符(`)ではありません。

代わりに角かっこ([および])をエスケープする必要があります。GNUを探す-name(または)の値を-iname次のように解釈します。全体的な状況

ありがとうございます。ムルそしてカミール・マコロフスキー私に正しい方向を教えてくれました!

これが私がこの問題を解決した方法です。ニュース:

while IFS= read -r song; do 
  unsquare=$(printf '%s\n' "$song" | sed 's/\[/\\[/g;s/\]/\\]/g') && 
   find /mnt/EXTHDD/unsorted -type f -name "$unsquare" 
done < list.txt

関連情報