我正在尝试列出给定目录$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"
答案 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##*/}