首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理在bash脚本中包含阿拉伯、中文、印地语字符的"YouTube文件名“?

如何处理在bash脚本中包含阿拉伯、中文、印地语字符的"YouTube文件名“?
EN

Unix & Linux用户
提问于 2020-05-23 07:47:51
回答 2查看 401关注 0票数 5

我下载了许多YouTube视频,并希望使用bash脚本处理它们。然而,所使用的文件名包含各种特殊和非ASCII字符。

如何在bash脚本中处理这个问题?

假设我想要创建一个指向文件夹中每个这样的文件的符号链接:

代码语言:javascript
运行
复制
# 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

由于文件名中的特殊字符,上述函数无法工作。

下面是一些示例文件名:

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

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-05-23 08:06:12

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

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

您还需要引用变量的扩展。您的文件名中有空格,并且不引用$video值,shell会将它们分割成多个单词,并将这些单词(在以这些模式执行文件名全局化之后)作为单独的参数提供给ln -s

不要使用ls生成文件名列表,并引用所有变量的扩展:

代码语言:javascript
运行
复制
counter=0

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

请注意,上面的代码将生成当前目录中的符号链接。如果您第二次运行这些链接,它将获取这些链接并创建指向这些符号链接的进一步链接。最好是在一个单独的目录中创建链接,对与循环一起使用的文件名全局模式更加小心,以避免链接,或者显式地测试循环中的链接并跳过这些链接。

代码语言:javascript
运行
复制
counter=0

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

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

代码语言:javascript
运行
复制
printf -v zcounter '%.4d' "$counter"

这将直接将重新格式化的计数器打印到zcounter变量。然后,在生成文件名时使用该变量。或者,您可以一次生成符号链接的名称,如下所示:

代码语言:javascript
运行
复制
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

另请参阅:

票数 7
EN

Unix & Linux用户

发布于 2020-05-23 19:43:49

使用“奇怪”字符处理文件名需要find - print0xargs -0bash引用。读man find; man xargs; man bash

例如:

代码语言:javascript
运行
复制
find . -type f -print0 | \
    xargs -0 -r bashscript

bashscript中,

代码语言:javascript
运行
复制
file="$1"
md5sum "$file"

等。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/588464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档