我正在尝试运行以下脚本并将具有特定模式名称的文件从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文件没有这样的文件或目录
请帮我搞清楚。
谢谢, 汤姆
答案 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
遇到的许多问题。