2013-09-22 37 views
2

我試圖列出給定目錄$1(及其子目錄)下的所有PDF文件,獲取每個文件中的頁數並使用pagecount計算兩個數字。我的腳本曾經工作過,但只適用於不包含空格的文件名,並且只在一個只填充了PDF文件的目錄中。我已經對它進行了一些修改(使用變量和引號等),但現在我有點卡住了。bash僅使用查找的第一個條目

我遇到的問題是,就像現在這樣,腳本只處理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" 

回答

1

在一個使用find for循環的問題是,如果你不引用命令,用空格的文件名會被分割,而如果你引用的命令,那麼整個結果將是在一次迭代中解析。

的解決方法是使用一個while循環,而不是像這樣:

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

閱讀這篇文章,更多的討論:http://mywiki.wooledge.org/ParsingLs

+0

謝謝,完美的作品! – Simon

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##*/} 
+0

爲什麼'執行發現'? – user000001

+1

@ user000001它可以防止不必要的附加子過程。只是我發明的東西,可能對任何人都不是已知的做法。 – konsolebox

+0

你能否詳細說明'exec find'和'$()'和'backticks'之間的區別?對於這一切我都很新穎。謝謝! – Simon

相關問題