bash 스크립트에서 아랍어, 중국어, 힌디어 문자가 포함된 "YouTube 파일 이름"을 처리하는 방법은 무엇입니까?

bash 스크립트에서 아랍어, 중국어, 힌디어 문자가 포함된 "YouTube 파일 이름"을 처리하는 방법은 무엇입니까?

YouTube 동영상을 많이 다운로드했는데 bash스크립트를 사용하여 처리하고 싶습니다. 그러나 사용된 파일 이름에는 다양한 특수 문자 및 비ASCII 문자가 포함되어 있습니다.

bash스크립트에서 이를 어떻게 처리할 수 있나요 ?

폴더에 있는 각 파일에 대한 심볼릭 링크를 만들고 싶다고 가정해 보겠습니다.

# Write filenames to filelist.txt in parent folder
ls ./* > ../filelist.txt

# Create sym links for all files in filelist.txt
counter=0
while read video_name; 
  do 
  counter=$((counter+1)); 

  ln -s $video_name  link_name_${counter}.mp4

done < ../filelist.txt

위 기능은 파일명에 특수문자가 포함되어 있어 동작하지 않습니다.

다음은 몇 가지 파일 이름 예입니다.

पेट (Stomach) कम करने के लिए  5 योग आसन-3G4pEY5njYE.mp4
मन शांत करने के लिए करे वृक्षासन योग _ स्वामी रामदेव-sPytQlaxoIg.mp4
वृक्षासन करने का तरीका और फायदे _ Swami Ramdev-A-2d04ON9hA.mp4

보너스:
또한 변수를 인쇄할 때 "선행 0"을 갖고 싶었지만 counter실제로는 중요하지 않습니다.

답변1

셸의 변수에는 파일 시스템의 파일 이름과 마찬가지로 NUL 문자를 제외한 모든 문자가 포함될 수 있습니다. 따라서 ls표시 목적으로 수정되었을 수 있는 손상된 출력을 읽는 경우를 제외하고는 파일 이름을 변수에 저장하는 데 문제가 없어야 합니다 ( ls출력은 엄격히 보기용입니다).

read편집된 질문에서는 기본값인 텍스트 파일의 파일 이름도 읽습니다 $IFS(이에 따라 작동 방식의 다양한 측면이 결정됩니다 read). 이렇게 하면 파일에서 읽은 줄에서 측면 공백이 제거되고 \문자가 입력에 나타나는 경우 문자가 특별히 해석될 수 있습니다. 또한 파일 이름에는 기술적으로 줄바꿈이 포함될 수 있으므로 이를 줄바꿈으로 구분된 목록(텍스트 파일의 줄)으로 저장하면 사용할 수 있는 이름 유형이 제한됩니다.

또한 변수의 확장을 인용해야 합니다. 파일 이름에 공백이 포함되어 있으며 값을 인용하지 않고 $video쉘은 이를 단어로 분할하여 다음을 제공합니다(추가로 해당 단어를 패턴으로 사용하여 파일 이름 글로빙을 수행한 후).별도의 주장도착하다 ln -s.

ls파일 이름 목록을 생성하고 모든 변수의 확장을 인용하는 데 사용하지 마십시오 .

counter=0

for video in ./*; do
    counter=$(( counter + 1 ))
    ln -s -- "$video" "link_name_$counter.mp4"
done

위의 코드는 현재 디렉토리에 심볼릭 링크를 생성합니다. 이 명령을 두 번째로 실행하면 이러한 링크가 선택되고 이러한 기호 링크에 대한 추가 링크가 생성됩니다. 별도의 디렉토리에 링크를 생성하거나, 링크를 피하기 위해 루프에 사용되는 파일 이름 글로빙 패턴에 더 주의하거나, 루프에서 링크를 명시적으로 테스트하고 건너뛰는 것이 좋습니다.

counter=0

for video in ./*; do
    [ -L "$video" ] && continue    # skip symbolic links
    counter=$(( counter + 1 ))
    ln -s -- "$video" "link_name_$counter.mp4"
done

0으로 채워진 4자리 카운터를 얻으려면 다음을 사용할 수 있습니다.

printf -v zcounter '%.4d' "$counter"

이렇게 하면 다시 포맷된 ​​카운터가 zcounter변수에 직접 인쇄됩니다. 그런 다음 해당 변수를 사용하여 파일 이름을 생성할 수 있습니다. 또는 다음을 통해 한 번에 심볼릭 링크 이름을 생성할 수 있습니다.

counter=0

for video in ./*; do
    [ -L "$video" ] && continue    # skip symbolic links
    counter=$(( counter + 1 ))

    printf -v linkname 'link_name_%.4d.md4' "$counter"
    ln -s -- "$video" "$linkname"
done

또한보십시오:

답변2

"이상한" 문자가 포함된 파일 이름을 처리해야 하며 find - print0인용 xargs -0됩니다 bash. 읽다 man find; man xargs; man bash.

예를 들어:

find . -type f -print0 | \
    xargs -0 -r bashscript

그리고 에서는 bashscript,

file="$1"
md5sum "$file"

등.

관련 정보