Bash에서 변수/배열(파일 이름 포함)을 사용할 때 파일 이름에서 따옴표를 감지하는 방법은 무엇입니까? [복사]

Bash에서 변수/배열(파일 이름 포함)을 사용할 때 파일 이름에서 따옴표를 감지하는 방법은 무엇입니까? [복사]

저는 며칠 동안 bash 스크립트 작업을 해왔는데 작은따옴표와 큰따옴표가 포함된 파일 이름이 붙어 있습니다. 디렉터리의 다음 파일을 반복하고 싶습니다.

'file1.txt'
'file2.txt'
"file3.txt"
file"3.txt
file'4.txt
very 'bad file.txt
also "very bad.txt

나는 이것이 잘못된 파일 이름 지정이라는 것을 알고 있습니다. 그러나 모든 사람이 프로그래머는 아니며 파일 이름을 올바르게 지정하는 방법을 아는 것은 아닙니다. 그래서 저는 이 극단적인 경우를 처리하려고 노력합니다.

이 파일을 반복하여 다음과 같은 if 문에서 사용하고 싶습니다.

dir="my/dir/"
files="$(ls -N "$dir"*)"

shopt -s extglob

for f in $files; do
  if [[ "$files" =  *"(*.png|*.jpg|*.jpeg|*.JPG|*.JPEG|*.webp)" ]]; then
    for $e in "$files"; do
      cp "$e" "$dir""somefilename.pdf"
    else
      cp "$f" "$dir""somefilename.pdf"
  fi
done

이제 문제가 발생합니다. bash는 파일 이름의 큰따옴표와 작은따옴표를 해석하고 파일을 분할합니다. 오류가 발생합니다...

그래서 내 질문은 : bash에서 이러한 상황을 어떻게 처리합니까?

답변1

출력을 구문 분석하지 마십시오 ls. 그것은 광기와 온갖 갈등이다. 특정 디렉토리의 모든 파일에 대해 작업을 수행하려는 경우 셸이 파일 이름을 처리하도록 합니다.

workdir="/path/to/directory"
for file in "${workdir}"/*; do
    case "$file" in
        *.png|*.jpg|*.jpeg|*.JPG|*.JPEG|*.webp)
            cp -- "$file" "$dir"/"somefilename.pdf"
            ;;
    esac
done

somefile.pdf일치하는 모든 파일을 반복적으로 덮어쓰는 모호한 논리를 가지고 있는 귀하의 질문에서 직접 술어를 가져왔는데 이는 아마도 귀하가 원하는 것이 아닐 것입니다. 이 문제를 해결하는 것은 반복 파일 문제의 범위를 벗어나므로 간단히 for file in path/to/place/*; do stuff_to "$file"; done.

관련 정보