2012-03-21 70 views
1

我有一堆以唯一编号开头的pdf文件。每个数字代表一个用户。现在我试图将每个用户的所有PDF文件连接成一个“AllInOne”文件。但是当我尝试运行我的bash脚本时,它不能识别pdftk命令中的通配符。bash脚本迭代中的通配符错误 - Shell

每个用户都会有一组被命名为这样的PDF文件:

1019-APP-CV-01.pdf 
1019-APP-SOI-01.pdf 
1019-APP-EC-01.pdf 
1019-APP-TOR-01.pdf  
1019-APP-TOR-02.pdf  
1019-ADM-LOR1-01.pdf 
1019-ADM-LOR2-01.pdf 

我试图运行这个bash脚本

# Script for concat all pdf files of an array of applicants to one file. 

#!/bin/sh 
cd FILES 
array=(1019 1041 1042 1043 1044 1049 1063 1070 1073 1074 1075 1077 1078 1079 1094 1105 1111 1115 1120 1122 1124 1137 1138 1141 1143 $ 

for i in "${array[@]}" 
do 
     pdftk $i-*.pdf cat output $i-AllInOne.pdf; 
done 

而且我已经得到了这些消息为所有用户。 错误消息:

Errors encountered. No output created. 
Done. Input errors, so no output created. 
Error: Failed to open PDF file: 
    1318-*.pdf 
Errors encountered. No output created. 
Done. Input errors, so no output created. 
Error: Failed to open PDF file: 
    1319-*.pdf 
Errors encountered. No output created. 
Done. Input errors, so no output created. 

是不是有什么毛病我通配符在bash脚本?

+0

将#!/ bin/sh放在文件的第三行是毫无意义的。只有当它出现在第一行的第一列时才使用shebang。 (即'#!'必须是文件的前两个字节。) – 2012-03-21 20:20:55

+0

注意。但为什么脚本仍然工作,当我'$ bash foobar.sh' ?? – alvas 2012-03-21 20:32:03

+0

因为您正在指定解释器而不是要求操作系统确定解释器。另外/ bin/sh不理解数组,这是bash特有的。 – 2012-03-21 21:44:38

回答

2

您的通配符对我来说很合适;您的错误消息很可能只是表示没有与FILES/目录中的1318-*.pdf模式匹配的文件(或者在当前目录中,并且cd因为FILES/不存在而失败;您可以添加pwd来检查此问题)。你看,在这样的命令:

echo 1318-*.pdf 

格局1318-*.pdf将只与文件名来代替,如果有任何文件名它与更换。否则,它保持不变,并按原样传递给命令。 (这是默认行为,你可以设置nullglob选项让它只是删除模式,或failglob使它失败并且不执行命令;但这两者在这里都没有帮助。)

这是可能的关闭文件名扩展,通过设置-f选项,所以,如果你愿意,你可以添加

set +f 

只是为了确保文件名扩展已开启;但我怀疑这是问题所在。

+0

通过检查后,我的通配符没有任何问题。问题在于这些pdf文件中的某些文件不能“pdftk”。我已经通过尝试手动完成其中的一些测试。谢谢!! – alvas 2012-03-21 19:54:08