bash只使用find中的第一个条目

时间:2013-09-22 10:00:27

标签: bash

我正在尝试列出给定目录$1(及其子目录)下的所有PDF文件,获取每个文件中的页数并使用pagecount计算两个数字。我的脚本用于工作,但仅限于不包含空格的文件名,并且仅在一个仅填充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"

2 个答案:

答案 0 :(得分:1)

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

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

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

阅读本文以获取更多讨论:http://mywiki.wooledge.org/ParsingLs

答案 1 :(得分: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##*/}