파일을 처리하는 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}" .