2011-12-21 76 views
1

我寫bash腳本用下面的代碼:bash的識別mv命令交互但在腳本命令錯誤

#! /bin/bash 
sc_files=`grep -l 'string' /home/test/dirpath/*` 
sc_dir='/home/test/mvdir' 
for i in $sc_files 
do 
    "mv -f $i $sc_dir"; 
done 

腳本的輸出產生: ./test.sh:線6 :MV -f /home/test/dirpath/test.txt /家/測試/ mvdir:沒有這樣的文件或目錄

然而,當這個確切的mv命令將被複制到同一個用戶在shell下,它的工作原理和移動文件。該目錄被命名,並有路徑,在腳本(如前所述,當命令被直接複製到一個交互的shell移動工作),我的用戶有rwx權限的源和目標目錄都。這些文件本身是由不同的用戶擁有的,但這不應該成爲對目錄寫入權限的問題。任何想法將不勝感激?

回答

3

作爲第一個答案

./test.sh: line 6: mv -f /home/test/dirpath/test.txt /home/test/mvdir: No such file or directory

試着在mv命令去掉雙引號後指出,你的移動命令的引用是不正確的。當引用整個命令及其參數時,bash會看到包含空格的整個字符串作爲命令。

有一個與你所提供的代碼段的另一個問題。如果任何文件的名稱中有空格,for循環將無法正常工作。即使您知道這些文件中沒有包含空格,但最好使用while循環代替。

sc_dir=/home/test/mvdir 
while read -r file 
do 
    mv -f "$file" "$sc_dir" 
done < <(grep -l 'string' /home/test/dirpath/*) 
+0

這很好,但可能有太多'<'對某些人來說也許:-) grep的' -l'string'/ home/test/dirpath/* |而讀-r'...會更容易閱讀。 – 2011-12-21 18:42:43

+0

很難選擇一個最好的位置,因爲他們是正確的。你有最詳細(並刷新我的記憶上的bash,它已經有一段時間),所以拜多給你,大家誰花時間來回答。 – 2011-12-21 19:19:28

+0

@AaronMcDaid - 雖然這可能是更容易閱讀,管道產生一個子shell而命令替換沒有。 – jordanm 2011-12-21 19:44:53

2

錯誤的報價,試圖

#! /bin/bash 
sc_files=`grep -l 'string' /home/test/dirpath/*` 
sc_dir='/home/test/mvdir' 
for i in $sc_files 
do 
    mv -f "$i" "$sc_dir"; 
done 
2

它被視爲字符串,並嘗試看看整條生產線是文件或目錄。這就是爲什麼你看到的錯誤:

mv -f $i $sc_dir; 

甚至更​​好:

mv -f "$i" "$sc_dir" 
1

假設的GNU工具,我會用這個來代替whilefor循環:

grep -lZ 'string' /home/test/dirpath/* | xargs -0 mv -ft "$sc_dir"