1

我有一个包含超过 7000 行字体名称的文本文件,这是我们设计部门需要的。该列表是由去除了任何文件扩展名的软件生成的。有些文件确实没有扩展名。

这个“fontList.txt”需要通过脚本读取并引用一个文件夹,该文件夹将包含许多子目录,其中包含数以万计的字体文件。原始文件将在适当的地方具有其文件扩展名。

挑战在于源列表中没有文件扩展名,但字体存在版本差异,因此较旧的 Type 1 变体可能是“Banana”,而新的 Open Type 可能是“Banana.otf”。可能需要这两个版本,但源列表只会引用“Banana”,因此脚本需要找到这两个版本。

在 Mac OS 10.8 的命令行上以交互方式运行它,我需要修改以下内容才能工作:

sourceList="/Users/"$useris"/Desktop/fontList.txt"
sourceDir="/Users/Shared/DesignFonts"

cat "$sourceList" |
while read FONTPATH
do
    echo font from source list to find and copy is "${FONTPATH}" | tee -a "$logPath"
    find "$sourceDir" -type f -name "${FONTPATH}" -exec cp -vf {} /Users/"$useris"/Desktop/fontPot/ \;
done

echo声明纯粹是为了检查目的。

目前,该脚本有效,但不会引用sourceDir具有文件扩展名的字体文件,例如.otf .ttf.

为了澄清,sourceList看起来像:

Marion
MetaNorCap
MetaNorCapExp
MinionPro-Bold

sourceDir内容看起来像:

Marion.ttc
MesquiteStd.otf
MetaNorCap
MetaNorCapExp
Microsoft
Microsoft Sans Serif.ttf
MinionPro-Bold.otf

注意:
上面的“Microsoft”是一个目录。
这些是来自更大 AZ 列表的示例列表。

4

2 回答 2

2

例如Helvetica.Neue.ttf,即使列表仅包含Helvetica. f2如果 fontList.txt 不包含通配符 ( []*?\),则不需要。

cat ~/Desktop/fontList.txt | while IFS= read -r f; do f2=$(sed 's/[][*?\]/\\&/g' <<< "$f"); find /Users/Shared/DesignFonts -type f \( -name "$f2" -o -name "$f2.*" \) -exec cp {} ~/Desktop/fontPot \;; done

或者,如果您安装 bash 4 ,则可以使用 globstar :

shopt -s globstar extglob; cat ~/Desktop/fontList.txt | while IFS= read -r f; do cp /Users/Shared/DesignFonts/**/"$f"?(.*) ~/Desktop/fontPot; done

glob 表达式也匹配目录,但 cp 应该拒绝复制它们。?(.?|.??|.???|.????)只会匹配 4 个字符或更短的扩展名。

于 2013-05-08T13:48:48.890 回答
0

您可以指定所有扩展名:

... -exec cp -vf {} {}.otf {}.ttf /Users/"$useris"/Desktop/fontPot/ \;
于 2013-05-08T13:32:39.937 回答