2017-06-13 535 views
0

我想要去的路徑,並刪除文件開始collectorlist*,所以我寫下如下的shell腳本,然而-e選項總是給輸出找不到。好心勸我。shell腳本文件搜索

腳本

if [ -d "/abc" ] ; then 
for c in `ls -1 "/abc/"`; do 
    if [ -d "/abc/${c}" ] ; then 
    if [ -d "/abc/${c}/dynatrace/agent/linux-x86-64/agent/conf/" ] ; then 
     if [ -e "/bxp/${c}/dynatrace/agent/linux-x86-64/agent/conf/collectorlist* " ] && echo "Found" || echo "Not found" ; then 
      `ls -ltr "sat.txt"` > /users/home/abc/test.txt 
      fi 
     fi 
    fi 
done 
fi 
+0

我刪除了*後尾隨的空間,問題仍然存在 – Satte

回答

1

有一些問題與您的代碼。

  1. 星號後面和結尾雙引號前有尾隨空格。
  2. 您在雙引號內使用星號;在雙引號內,通配符如星號不會被評估,而是逐字採用。
  3. 您正在使用反引號和重定向。這將執行反引號內的內容,用它的輸出替換反引號並執行結果行。所以你的ls命令需要給出一個命令的名字,然後執行。我想你不想那樣。只要刪除反引號,你可能只是想執行ls並將其輸出重定向到一個文件中。
  4. 您試圖確定是否存在任何匹配一個模式的文件,並使用[ -e pattern* ]pattern*評估爲一個或多個文件名或(不存在)pattern*本身(除非你調整你的shell的行爲不同)。問題在於許多值的情況。這些會在您的[ ... ]表達式中造成問題。

結果:

if [ -d "/abc" ] ; then 
    for c in $(ls -1 "/abc/"); do 
    if [ -d "/abc/${c}/dynatrace/agent/linux-x86-64/agent/conf/" ] ; then 
     if ls "/bxp/${c}/dynatrace/agent/linux-x86-64/agent/conf"/collectorlist* &> /dev/null; then 
     echo "Found" 
     ls -ltr "sat.txt" > /users/home/abc/test.txt 
     else 
     echo "Not Found" 
     fi 
    fi 
    done 
fi 
+0

它只是完美。非常感謝 – Satte