2

我正在尝试列出给定目录$1(及其子目录)下的所有 PDF 文件,获取每个文件中的页数并使用页数计算两个数字。我的脚本过去可以工作,但只能在不包含空格的文件名上工作,并且只能在一个只填充 PDF 文件的目录中工作。我已经对其进行了一些修改(在变量周围使用引号等),但现在我有点卡住了。

我遇到的问题是,就像现在一样,脚本只处理find . -name '*.pdf'. 我将如何处理其余部分?

#!/bin/bash

wd=`pwd`
pppl=0.03 #euro
pppnl=0.033 #eruo

cd $1
for entry in "`find . -name '*.pdf'`"
do
        filename="$(basename "$entry")"
        pagecount=`pdfinfo "$filename" | grep Pages | sed 's/[^0-9]*//'`
        pricel=`echo "$pagecount * $pppl" | bc`
        pricenl=`echo "$pagecount * $pppnl" | bc`
        echo -e "$filename\t\t$pagecount\t$pricel\t$pricenl"
done

cd "$wd"
4

2 回答 2

1

在 for 循环中使用 find 的问题在于,如果您不引用命令,带有空格的文件名将被拆分,如果您引用命令,那么整个结果将在一次迭代中解析。

解决方法是改用 while 循环,如下所示:

find . -name '*.pdf' -print0 | while IFS= read -r -d '' entry
do
    ....
done

阅读这篇文章以获得更多讨论: http: //mywiki.wooledge.org/ParsingLs

于 2013-09-22T10:04:15.790 回答
1

使用分词是个坏主意。请改用 while 循环。

while read -r entry
do
        filename=$(basename "$entry")
        pagecount=$(pdfinfo "$filename" | grep Pages | sed 's/[^0-9]*//')
        pricel=$(echo "$pagecount * $pppl" | bc)
        pricenl=$(echo "$pagecount * $pppnl" | bc)
        echo -e "$filename\t\t$pagecount\t$pricel\t$pricenl"
done < <(exec find . -name '*.pdf')

$()在可能的情况下也更喜欢backticks""当变量或命令替换用于赋值时,您也不需要放置它们。

    filename=$(basename "$entry")

也可以只是

    filename=${entry##*/}
于 2013-09-22T10:06:56.247 回答