$ 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