如何处理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

奖励:
我还希望在打印counter变量时有“前导零”,但这并不重要。

答案1

shell 中的变量可以包含除 NUL 字符之外的任何字符,就像文件系统中的文件名一样。因此,将文件名存储在变量中应该不会有任何问题,除非您读取 的损坏输出ls,该输出可能会出于显示目的而被修改(ls输出严格用于查看)。

在编辑的问题中,您还从文本文件中读取文件名,read默认值是$IFS(这决定了工作方式的各个方面read)。这将从文件读取的行中去除侧翼空白,并且\如果该字符出现在输入中,则可以特殊解释该字符。另请注意,从技术上讲,文件名可能包含换行符,因此将它们存储为换行符分隔列表(文本文件中的行)会限制可以使用的名称类型。

您还需要引用变量的扩展。您的文件名中包含空格,并且在不引用值的情况下$video,shell 会将它们分成多个单词并给出这些单词(在使用这些单词作为模式额外执行文件名通配之后):单独的论点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

要获得四位数字的零填充计数器,您可以使用

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 -0bash引用。读man find; man xargs; man bash

例如:

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

并且,在bashscript

file="$1"
md5sum "$file"

ETC。

相关内容