shell脚本将.pdf文件更改为.png

时间:2011-06-16 17:12:35

标签: bash scripting

不确定如何询问有关之前发布的问题的问题,所以如果我只是添加到上一个问题,请以某种方式随时告诉我。 无论如何,我昨天发了一个问题 shell script to change .pdf files to .png Mac OS 10.3

sips确实有效,如果我在命令行上一次执行一个文件,但是我的for循环不起作用

继承人我得到了什么

for pdf in *{pdf,PDF} ; do
    sips -s format png --out "${pdf%%.*}.png" "$pdf"
done

及其说法

Warning: *{pdf, not a valid file - skipping 
Error 4: no file was specified 
Try 'sips --help' for help using this tool

感谢

4 个答案:

答案 0 :(得分:2)

对我来说很好看。您确定使用bash来执行此脚本而不是/bin/sh吗?

确保您的第一行是:

#! /bin/bash

尝试回显文件并查看其是否有效:

for pdf in *{pdf,PDF} ; do
    echo "$pdf"
done

答案 1 :(得分:1)

如果你的shell是bash,你可以这样做

shopt -s nullglob

当没有globs匹配时,这会改变bash的行为。通常,如果你说*pdf并且没有以“pdf”结尾的文件,它将返回一个文字星号。设置nullglob会使bash按照您的预期执行,并且在这种情况下不返回任何内容。

或者,更强大,你可以这样做

for pdf in *[pP][dD][fF] ; do 
    sips -s format png --out "${pdf%%.*}.png" "$pdf"
done

在没有设置nullglob的情况下,以及在支持使用此语法进行参数替换的所有shell中,哪个应该可以正常工作。请注意,如果您有两个PDF文件,其名称因扩展名而异,则由于存在名称冲突的风险,在案例敏感的文件系统上仍然不健壮。要正确处理这种情况,你可以做到

for pdf in *[pP][dD][fF] ; do 
    sips -s format png --out "${pdf%%.*}.$(tr pPdDfF pPnNgG <<<"${pdf#*.}")" "$pdf"
done

这应该足够强大。

编辑:已更新,以更正扩展程序中错误的$pdf扩展。

答案 2 :(得分:0)

<强> UPDATED2

#!/bin/bash

# Patters patching no files are expanded into null string
# this will allow us to make this script work when no files
# exist in this directory with this extension
shopt -s nullglob

# Consider only the lowercase 'pdf' extensions and make them lowercase 'png'
for b in *.pdf
  do
    c="$b"
    b="${b/.pdf/}"
    convert"$c" "$b.png"
done

# Consider only the uppercase 'pdf' extensions and make them uppercase 'png'
for b in *.PDF
  do
    c="$b"
    b="${b/.PDF/}"
    convert "$c" "$b.PNG"
done

请注意,convert计划是ImageMagick计划的一部分。

答案 3 :(得分:-1)

你正在使用的glob语法看起来很时髦。尝试:

for pdf in *.pdf *.PDF ; do
    ...
done