2013-05-08 63 views
1

我有一個超過7000行字體名稱的文本文件,這是我們設計部門需要的。此列表是由軟件生成的,該軟件刪除了任何文件擴展名。有些文件確實沒有擴展名。Bash引用txt列表來查找目錄中的數據和複製項目

這個「fontList.txt」需要通過腳本讀取並引用一個文件夾,該文件夾將包含許多子目錄,其中包含數以萬計的字體文件。原始文件將在適當情況下具有文件擴展名。

挑戰在於源列表中沒有文件擴展名,但是字體存在版本差異,因此較早的類型1變體可能是「香蕉」和新的打開類型「Banana.otf」。這兩個版本可能都是必需的,但源列表只會引用「香蕉」,所以腳本需要找到兩者。

在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樣子:

馬里昂
MetaNorCap
MetaNorCapExp
MinionPro粗體

儘管sourceDir內容類似於:

Marion.ttc
MesquiteStd.otf
MetaNorCap
MetaNorCapExp
微軟
Microsoft無Serif.ttf
MinionPro-Bold.otf

注:
「微軟」 上面是一個目錄。
這些是來自更大的A-Z列表的示例列表。

回答

2

這也將匹配,例如Helvetica.Neue.ttf即使只列出包含Helvetica。如果fontList.txt不包含通配符([]*?\),則不需要f2

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

或者你可以使用globstar如果你install bash 4

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

的全局正則表達式也匹配目錄,但CP應該拒絕複製它們。 ?(.?|.??|.???|.????)只能匹配4個字符或更短的擴展名。

0

可以指定所有的擴展:

... -exec cp -vf {} {}.otf {}.ttf /Users/"$useris"/Desktop/fontPot/ \; 
+0

如果'Helvetica'和'Helvetica.otf'在不同的目錄下怎麼辦? – user495470 2013-05-08 14:09:52