$ 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