cygwin cp无法统计文件

时间:2013-07-08 19:53:49

标签: bash cygwin

我正在尝试运行以下脚本并将具有特定模式名称的文件从Source复制到工作中。

#!/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不能stat文件没有这样的文件或目录

请帮我搞清楚。

谢谢, 汤姆

3 个答案:

答案 0 :(得分:1)

"FILE"只是一个字符串。您正在尝试复制名称为FILE的文件。也许你的意思是

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

答案 1 :(得分:0)

环境变量名称在Cygwin中区分大小写(与所有POSIX shell一样,与Windows不同),因此$Copy_Pattern(设置为P0689|P1391|P0730)和$COPY_PATTERN(未定义)为两个不同的变量。

您还应该知道{b}的-x命令行切换,它将以跟踪模式运行您的脚本。这在调试bash脚本时非常有用,我相信它可以帮助你找到问题所在。

答案 2 :(得分: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的调试器。它打印出在shell脚本中写入的正在执行的行,然后在完成所有可变插值后打印出该行。这将让您看到您的程序正在处理的每个集合,以及它可能遇到问题的位置。 set +xv只是关闭调试。

我怀疑问题出在cp -f "FILE" "$WORKING"行,因为文件FILE实际上并不存在。我还怀疑你正在拾取文件名(并且在那里复制失败),你可能不会在复制文件之前检查目录是否实际存在。使用set -o xv,您会很清楚地看到很多这些错误。

cp放在echo语句中还可以让您在实际执行之前看到您计划执行的内容。这是帮助调试shell脚本的另一种方法。

我还怀疑你的for循环可能没有完全符合你的要求。这是一个过于复杂的坏男孩,你一次执行两个子shell命令。 (一旦使用$(..)而另一个使用反向标记。由于各种各样的问题,我强烈反对使用for var in $(find ...)。首先,find必须在{for之前完成执行1}}循环可以开始 - 没有并行操作。其次,如果有时髦的文件名,你的for将会失败。第三,find很可能返回这么多的文件,你的命令缓冲区溢出并静默地删除文件的名称,甚至没有让你知道它正在发生。你可以更好地使用:

 find ... | while read something

它消除了for遇到的许多问题。