2013-07-08 56 views
0

我想運行下面的腳本,並從特定模式的名稱從源文件複製文件到工作。cygwin cp不能stat文件

#!/bin/bash 
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required 
SOURCE="D:/backup/" 
WORKING="D:/copyFromHere/" 
Copy_Pattern="P0689\|P1391\|P0730" 

for FILE in $(find "$SOURCE" `ls -Rl "$SOURCE" | egrep '^d' | awk '{print $9}'` -print 
2>/dev/null | grep "$COPY_PATTERN" |sed 's/_[0-9]\+//' | uniq); 

do 
cp -f "FILE" "$WORKING"; 

done; 

我在Windows上運行它在cygwin上。

但我得到以下錯誤 CP無法統計文件沒有這樣的文件或目錄

請幫我搞清楚了這一點。

感謝, 湯姆

回答

0

我可以做一個小建議:

#!/bin/bash 
set -xv 
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required 
SOURCE="D:/backup/" 
WORKING="D:/copyFromHere/" 
Copy_Pattern="P0689\|P1391\|P0730" 

for FILE in $(find "$SOURCE" `ls -Rl "$SOURCE" | egrep '^d' | awk '{print $9}'` -print 2>/dev/null | grep "$COPY_PATTERN" |sed 's/_[0-9]\+//' | uniq); 
do 
    echo "cp -f \"FILE\" \"$WORKING\""; 
done; 
set +xv 

set -xv是殼調試器。它將打印出正在執行的行,如同在shell腳本中所寫的那樣,然後在所有變量插值完成後打印出行。這將讓你看到你的程序正在採取的每一套,以及它可能有問題的地方。 set +xv只是關閉調試。

我懷疑問題出在cp -f "FILE" "$WORKING"行,因爲文件FILE實際上並不存在。我也懷疑你正在拾取文件名(並且在那裏複製失敗),並且在你複製文件之前你可能沒有檢查目錄是否真實存在。使用set -o xv,你會很清楚地看到很多這些錯誤。

將您的cp置於echo語句中還可以讓您在實際執行之前看到您正在執行的計劃。這是幫助調試shell腳本的另一種方法。

我也懷疑你的for循環可能沒有做到你想要的。這是一個非常複雜的壞男孩,你一次執行兩個子shell命令。 (一旦使用$(..),另一個使用back-ticks,由於各種問題,我強烈反對使用for var in $(find ...)。首先,find必須在for循環開始之前完成執行 - 沒有並行操作。有時髦的文件名,你的for只會失敗;第三,很有可能find返回那麼多文件,你的命令緩衝區溢出,並且在沒有讓你知道它正在發生的情況下悄悄丟棄文件名。 :

find ... | while read something 

它消除了您的for將遇到的許多問題。

1

"FILE"只是一個字符串。你正試圖複製一個文件名爲FILE的文件。也許你的意思

cp -f "$FILE" "$WORKING"; 
     ^--- missing $? 
+0

我在$中執行了FILE(找到「$ SOURCE」'ls -Rl「$ SOURCE」| egrep'^ d'| awk'{print $ 9}''-print 2>/dev/null | grep「$ C​​OPY_PATTERN 「| sed's/_ [0-9] \ + //'| uniq);在上面的步驟 – tom

+0

是的,你在for循環中使用了文件,但實際** USE ** $ FILE變量,你必須使用它作爲'$ FILE'。 ''FILE''本身就是一個包含'F','I','L'和'E'的字符串,而不是在循環中分配給$ FILE的文件名。 –

0

環境變量名稱是區分Cygwin中敏感的(如在所有的POSIX殼,並與Windows),所以$Copy_Pattern(設置爲P0689|P1391|P0730)和$COPY_PATTERN(沒有定義)是兩個不同的變量。

您還應該知道-x命令行切換到bash,它將以跟蹤模式運行您的腳本。這對調試bash腳本非常有幫助,我相信它可以幫助您找到問題所在。