$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

관련 정보