bash 스크립트는 파일 이름을 [ 및 ]와 올바르게 비교하지 않습니다.

bash 스크립트는 파일 이름을 [ 및 ]와 올바르게 비교하지 않습니다.

파일을 처리하는 bash 스크립트가 있습니다. find한 디렉터리의 모든 파일과 다른 디렉터리의 각 파일 이름을 검색합니다 . 이를 위해 다음을 사용합니다.

"${myfiletobesearched}"

스크립트 내부. 그러나 파일 이름에 [ 또는 ]가 포함되어 있으면 파일 복사본이 있더라도 스크립트는 두 번째 디렉터리에서 해당 파일을 찾지 않습니다. 파일 이름이 동일하게 인식되게 하려면 어떻게 해야 합니까?

문제의 범위를 예시로 좁힐 수 있었습니다.

myfile="My File [Official Awesome File].txt"
find ./ -name "${myfile}" -type f

해당 이름의 파일이 있어도 출력이 제공되지 않습니다. \[물론 글을 쓰거나 그런 거요.옵션이 아니다, myfile수표 디렉토리에서 발생하기 때문입니다.

스크립트는 다음과 같습니다.https://gist.github.com/Make42/5bdae5e4de32cff0d01c9486b09383ee

답변1

myfile="My File [Official Awesome File].txt"
myfile=$(echo $myfile | sed -r 's/(\[|\])/\\\1/g')    
find ./ -name "${myfile}" -type f

이것이 작동하는지 확인할 수 있습니까?

myfile나는 이것이 다음 의 값으로 바뀔 것이라고 예상했습니다 .

myfile="My File \[Official Awesome File\].txt"

더 나은 방법은 다음을 사용하는 것입니다 printf.

myfile=$(printf '%q\n' "$myfile")

구체적인 예에서는 find다음과 같습니다.

find ./ -name "$(printf '%q\0' "$myfile")" -type f

답변2

주장을 찾고-이름매개변수는글로벌 모드,하나도 아니야파일 이름대괄호는 전역 패턴 메타 문자입니다.

이 문제를 해결하기 위해 제가 찾은 한 가지 방법은 패턴 대신 정확한 문자열 일치를 사용하는 인라인 Perl 스크립트를 사용하는 것입니다.

myfile="My File [Official Awesome File].txt"
perl -MFile::Find -le 'find( sub {
  return unless $_ eq $ARGV[0];
  print $File::Find::name;
}, $ARGV[1] )' "${myFile}" .

관련 정보