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
酷客网相关文章:
评论前必须登录!
注册