2014-12-03 28 views
2

我正在嘗試編寫一個bashrc函數,以便在與「-exec rm」配對時向find命令添加安全檢查。該腳本將以「-exec rm」開頭的所有內容剪掉,並用「-print0」代替,然後傳遞給sed,以便在用戶使用帶引號的experssion時重新添加缺少的引號。/etc/bashrc中的函數未通過變量傳遞引號

我遇到了一個問題,我通過sed添加的引號沒有被傳遞給執行find命令的行。

改寫find命令,並重新添加引號:

FIND_VAR=$(echo "[email protected]" | sed "s/-exec rm.*/-print0/g" | sed 's/\*.*/"&" /g' | sed 's/ "/"/g') 

運行與修改find​​命令:

FIND_LIST=$(/bin/find $FIND_VAR | sed 's|\./| \./|g') 

我想做到的是,如果用戶鍵入以下命令:

find ./ -type f -name "*.txt" -exec rm -rf {} \; 

該命令通過bashrc重寫爲:

find ./ -type f -name "*.txt" -print0 | sed 's|\./| \./|g' 

這產生每個間隔開,其被傳遞到一個修改的RM功能的文件的列表:

./file1.txt ./file2.txt ./file3.txt ... 

全功能如下以供參考:

 function find() { 
      if echo "[email protected]" | grep -q '-exec rm' ; then 
      echo "Found rm command as part of find" 
      FIND_VAR=$(echo "[email protected]" | sed "s/-exec rm.*/-print0/g" | sed 's/\*.*/"&" /g' | sed 's/ "/"/g') 
      echo "/bin/find $FIND_VAR" 
      FIND_LIST=$(/bin/find $FIND_VAR | sed 's|\./| \./|g') 
      echo "$FIND_LIST" 
      echo "rm$FIND_LIST" 
      else 
      /bin/find "[email protected]" 
      fi 
     } 

回答

2

別把一個命令放在一個字符串中。不起作用。有關更多詳情和討論,請參閱http://mywiki.wooledge.org/BashFAQ/050

你有一個數組中的命令。用它。

步行數組,找到要刪除的參數並將其刪除,然後將要添加的參數添加到數組並運行新命令。