我有以下场景,而且我的编码器并不多(我也不太了解bash)。我甚至没有基础工作的bash脚本可以分享,所以任何帮助都会受到赞赏。
我有一个文件共享,其中包含文件管理系统的tiff(数千个)。目标是将多个文件tiff转换并组合成单个文件pdf(最好是PDF / A 1a格式)。
目录格式:
/Document Management Root # This is root directory
./2009/ # each subdirectory represents a year
./2010/
./2011/
....
./2016/
./2016/000009.001
./2016/000010.001
# files are stored flat - just thousands of files per year directory
文档管理系统存储带有序列号文件名的tiff以及顺序文件后缀:
000009.001
000010.001
000011.002
000012.003
000013.001
文档的每个页面都由后缀表示。创建新的非相关文档时,后缀将重新启动。在上面的示例中,000009.001
是单页tiff。文件000010.001
,000011.002
和000012.003
属于同一文档(即页面都相关)。文件000013.001
代表新文档。
我需要保留多页文档的第一个文件的文件名,以便文件名可以与文档管理系统数据库交叉引用以获取元数据。
我提出的伪代码是:
for each file in {tiff directory}
while file extension is "001"
convert file to pdf and place new pdf file in {pdf directory}
else
convert multiple files to pdf and place new pd file in {pdf directory}
但是,无论下一个文件是什么,这似乎都会产生转换所有001文件的副作用。
非常感谢任何帮助。
编辑 - 以下两个答案都有效。第二个答案有效,但是我没有意识到我测试过的数据集与上面的情况不同,这是我的错误。
答案 0 :(得分:2)
因此,请将以下脚本保存在您的登录($ HOME)目录中TIFF2PDF
#!/bin/bash
ls *[0-9] | awk -F'.' '
/001$/ { if(NR>1)print cmd,outfile; outfile=$1 ".pdf"; cmd="convert " $0;next}
{ cmd=cmd " " $0}
END { print cmd,outfile}'
通过进入终端并运行:
使其可执行(仅需一次)chmod +x TIFF2PDF
然后将任何给定年份的一些文档复制到临时目录中进行尝试...然后转到目录并运行:
~/TIFF2PDF
示例输出
convert 000009.001 000009.pdf
convert 000010.001 000011.002 000012.003 000010.pdf
convert 000013.001 000013.pdf
如果看起来正确,你可以实际执行这样的命令:
~/TIFF2PDF | bash
或者,最好安装 GNU Parallel :
~/TIFF2PDF | parallel
脚本说... “生成名称以数字结尾的所有文件的列表,并将该列表发送到awk
。在awk
中,使用点作为两者之间的分隔符字段,因此如果文件名为00011.0002
,则$0
将为00011.0002
,$1
将为00011
,$2
将为0002
1}}。现在,如果文件名以0001
结尾,则打印累积的命令并附加输出文件名。然后保存带有PDF
扩展名的文件名前缀作为下一个PDF的输出文件名并开始构建下一个 ImageMagick convert
命令。在后续行(不以0001
结尾)中,将文件名添加到文件列表中以包含在{{1最后,输出任何累积的命令并附加输出文件名。“
关于图像底部的丑陋黑色块,它的发生是因为那里有一些微小的白色斑点阻止ImageMagick移除黑色区域。我把它们用红色圈起来了:
如果您将图片模糊一点(以扩散斑点)然后获得修剪框的大小,您可以将其应用于原始的,不显眼的图像,如下所示:
PDF
我建议您先对所有图像进行复制,然后再运行PDF转换。由于您需要保存TIFF文件但扩展名为trimbox=$(convert original.tif -blur x2 -bordercolor black -border 1 -fuzz 50% -format %@ info:)
convert original.tif -crop $trimbox result.tif
,0001
,因此您需要告诉 ImageMagick 修剪并强制输出文件类型为TIF:
0002
作为@AlexP。提到,如果有大量文件,可能会出现globbing问题。在OSX上,ARG_MAX非常高(262144)并且您的文件名大约为10个字符,因此如果一个目录中有超过26,000个文件,则可能遇到问题。如果是这种情况,只需更改:
original=XYZ.001
trimbox=$(convert $original -blur x2 -bordercolor black -border 1 -fuzz 50% -format %@ info:)
convert $original -crop $trimbox TIF:$original
到
ls *[0-9] | awk ...
答案 1 :(得分:1)
以下命令将转换整个/Document Management Root
树(假设它是实际的绝对路径)正确处理所有子文件夹,即使名称包含空格字符并正确跳过所有其他不匹配000000.000
命名模式的文件:
find '/Document Management Root' -type f -regextype sed -regex '.*/[0-9]\{6\}.001$' -exec bash -c 'p="{}"; d="${p:0: -10}"; n=${p: -10:6}; m=10#$n; c[1]="$d$n.001"; for i in {2..999}; do k=$((m+i-1)); l=$(printf "%s%06d.%03d" "$d" $k $i); [[ -f "$l" ]] || break; c[$i]="$l"; done; echo -n "convert"; printf " %q" "${c[@]}" "$d$n.pdf"; echo' \; | bash
要进行干运行,请最后删除| bash
。
已更新以匹配00000000.000
模式(为清晰起见,拆分为多行):
find '/Document Management Root' -type f -regextype sed -regex '.*/[0-9]\{8\}.001$' -exec bash -c '
pages[1]="{}"
p1num="10#${pages[1]: -12:8}"
for i in {2..999}; do
nextpage=$(printf "%s%08d.%03d" "${pages[1]:0: -12}" $((p1num+i-1)) $i)
[[ -f "$nextpage" ]] || break
pages[i]="$nextpage"
done
echo -n "convert"
printf " %q" "${pages[@]}" "${pages[1]:0: -3}pdf"
echo
' \; | bash