作者 主題: 一隻小小shell卡了好久, 檔案存在判定問題!  (閱讀 4212 次)

0 會員 與 1 訪客 正在閱讀本文。

nra65dr

  • 懷疑的國中生
  • **
  • 文章數: 85
    • 檢視個人資料
Dear 前輩,

在下我寫一支小小的shell, 主要是用來排程判定當某個目錄有*.pdf檔定存在時,就自動發mail給User 與 移動檔案!

但是在判定檔案時一直有問題...
主要用是test和 if [ -f ]指令,
ex:
test -f ${dr[$i]}*.pdf

當我的ftp目錄下有一個pdf时,執行是正常! 但是有兩個檔案以上時會出現下面的訊息...
***/***/abc.pdf: binary operator expected

原因我大概可以猜出來,就是test和 if [ -f ] 指指令不能判定目錄有兩個上以的檔案吧(原本就是判定某一檔案或目錄)
請教各位大大,
有其它方式可以判定目錄中有無檔案的好方式嗎?
謝謝指教!!!


Shell如下:
--------------------------------------------

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
#export LANG=C

mail1="abc@abc.com.tw"
dr=(/home/ec011/ /home/cs013/ /home/bj002/ /home/de011/ /home/hu006/)
ds1=/mnt/r80pcb
cust=(耀新EC011 慶生CS013 博智BJ002 定穎DE011 瀚宇博德HU006)
for ((i=0; i<${#dr
  • }; i++)); do

       test -f ${dr[$i]}*.pdf && cd ${dr[$i]} &&  du -sh *.pdf | mailx -s "${cust[$i]}有新的文件!"
done
-----------------------------
« 上次編輯: 2010-10-24 09:57 由 nra65dr »

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
用 var=`find -iname "*.pdf"`,判斷 $var 是否空白

nra65dr

  • 懷疑的國中生
  • **
  • 文章數: 85
    • 檢視個人資料
用 var=`find -iname "*.pdf"`,判斷 $var 是否空白

是改成下面這樣嗎?
我試了還是不行, 好像是-iname參數的問題?
謝謝指教

mail1="abc@abc.com.tw"
dr=(/home/ec011/ /home/cs013/ /home/bj002/ /home/de011/ /home/hu006/)
ds1=/mnt/r80pcb
cust=(耀新EC011 慶生CS013 博智BJ002 定穎DE011 瀚宇博德HU006)
for ((i=0; i<${#dr
  • }; i++)); do

      if [ -z `find -iname "*.pdf"`]; then  cd ${dr[$i]} &&  du -sh *.pdf | mailx -s "${cust[$i]}有新的文件!"
done

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
我覺得你把 custom name 放到各別目錄下的 .name 檔比較好,不要把資料對應寫在 script 裡。增加或刪減時容易錯誤。
下面的 pdfexist 是 bash function, 你只要寫好這個 function 就搞定了。

dr='user1 user2 user3'
for i in $dr; do
  $hmdr=/home/$i
  custname=`cat $hmdr/.name`
  pdfexist $hmdr && mail -s "$cusname has pdf file" me@example.com
done

pdfexist {
# return true if pdf exist in $1 directory
# return false otherwise
...
}

nra65dr

  • 懷疑的國中生
  • **
  • 文章數: 85
    • 檢視個人資料
Dear Sir,

謝謝熱心回答,
不過, 主要還是在在find *.pdf 的判斷pdf問題 :'( :'(

我用 find -iname參數找時, 現在又臭又長的訊息...
小弟不才,難以理解!

Thanks!

find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-iname /opt/checkfile.sh' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ /opt/checkfile.sh'

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
fnlist=`find $hmdr -iname "*.pdf"`
判斷 $fnlist 是否空白


gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
給你範例,剩下的你應該可摸索出來了

dr='user1 user2'
for i in $dr; do
   hmdr=/home/$i
   fn=`find $hmdr -iname "*.pdf"`
   if [ ! -z "$fn" ];then
     echo "found in $hmdr"
   else
     echo "not found in $hmdr"
   fi
done

HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3980
    • 檢視個人資料
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
#export LANG=C

mail1="abc@abc.com.tw"
dr=(/home/ec011/ /home/cs013/ /home/bj002/ /home/de011/ /home/hu006/)
ds1=/mnt/r80pcb
cust=(耀新EC011 慶生CS013 博智BJ002 定穎DE011 瀚宇博德HU006)
for ((i=0; i<${#dr* }; i++)); do
    cd ${dr[$i]}
    ls *.pdf
    if [ $? -eq 0 ]; then
        du -sn *.pdf | mailx .................
   fi
done
我做人那麼 nice, 肯定有什麼誤會.....