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"
등.