Bash Shell处理文件名的怪异字符

Bash Shell处理文件名的怪异字符,按照 查找所有的MP3文件中的做法使用 find 命令,却没有得到想要的结果,因为很多文件名中有怪异的字符。

解决方案

首先,要理解 Unix 用户口中的怪异(odd)字符是指“除小写字母和数字之外的任何字符”。因此,大写字母、空格、标点符号、声调字符统统都属于怪异字符,但是你会发现很多歌曲名中的怪异字符远不止这些。

根据字符的怪异程度以及你的系统、工具和目标,可能将替换字符串放进引号就足够了(也就是在 {} 两边加上引号,即 '{}')。你总得先测试一下命令吧?

如果不行,尝试使用 find 的 -print0 选项和 xargs 的 -0 选项。-print0 告诉 find 不要用空白字符,而是改用空字符(null character)(\0)作为输出的文件名之间的分隔符。-0 告诉 xargs 输入分隔符是空字符。两者配合的效果不错,但并非所有系统都支持这两个命令。

xargs 命令从标准输入中接收以空白字符分隔(指定 -0 时除外)的文件名,然后对尽可能多的文件(略微少于系统的 ARG_MAX 值。由于调用其他命令会带来不小的开销,因此使用 xargs 可以显著提升操作速度,因为它能够尽量减少命令的调用次数,而不是每个文件都调用。

因此,可以重写 查找所有的MP3文件中的解决方案来处理怪异字符。

find . -name '*.mp3' -print0 | xargs -i -0 mv '{}' ~/songs

以下是一个类似示例,它演示了在定位并复制文件时,如何用 xargs 解决路径或文件名中的空格。

locate P1100087.JPG PC220010.JPG PA310075.JPG PA310076.JPG | xargs -i cp '{}' .

讨论

这个解决方案存在两个问题。首先,并非所有的 xargs 版本都支持 -i 选项,另外,-i 选项无法实现参数分组,自然也就无法提升执行速度。问题是,mv 命令需要将目标目录作为最后一个参数,而传统的 xargs 只是简单地获取输入,然后将其附加到指定命令的尾部,直到达到上限(也就是系统的 ARG_MAX 值) 或处理完输入。这样一来,mv 命令肯定报错。有些 xargs 版本提供了 -i 选项,默认使用 {} 作为替换字符串(类似于 find),但加入 -i 选项会导致对每个参数都要执行一次命令。相较于 find 的 -exec,唯一的优势就是能够处理怪异字符。

xargs 最有效的场景是与 find 以及那种只需要参数列表的命令(如 chmod)配合使用。在处理大量文件名时,你可以看到 xargs 所带来的速度优化。例如:

find some_directory -type f -print0 | xargs -0 chmod 0644

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!