Bash cygwin cp无法统计文件

Bash cygwin cp无法统计文件,bash,cygwin,Bash,Cygwin,我正在尝试运行下面的脚本,并将具有特定名称模式的文件从源文件复制到工作文件 #!/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 -R

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

#!/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无法统计文件没有这样的文件或目录

请帮我弄清楚

谢谢, Tom

“文件”
只是一个字符串。您正试图复制一个文件,其名称字面上是
file
。也许你的意思是

cp -f "$FILE" "$WORKING";
       ^--- missing $?
“文件”
只是一个字符串。您正试图复制一个文件,其名称字面上是
file
。也许你的意思是

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

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


您还应该注意bash的
-x
命令行开关,它将在跟踪模式下运行脚本。这对调试bash脚本非常有帮助,我相信它会帮助您找到问题所在。

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


您还应该注意bash的
-x
命令行开关,它将在跟踪模式下运行脚本。这对调试bash脚本非常有帮助,我相信它会帮助您找到问题所在。

我可以提出一点建议:

#!/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命令。(一次使用
$(..)
,另一次使用back ticks。我强烈反对在$(find…)中对var使用
因为各种各样的问题。首先,
find
必须在
for
循环开始之前完成执行——没有并行操作。第二,如果有奇怪的文件名,你的
for
将完全失败。第三,很可能
find
返回的文件太多,以至于你的命令缓冲区无法运行RFlow并以静默方式删除文件名,甚至不让您知道正在发生。您可以更好地使用:

 find ... | while read something

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

我可以提出一点建议:

#!/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
只是关闭调试器g

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

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

我还怀疑您的
for
循环可能没有完全按照您的要求执行。这是一个过于复杂的坏家伙,您同时执行两个sub-shell命令。(一次使用
$(..)
,另一次使用back ticks。我强烈反对在$(find…)中使用
for var
因为各种各样的问题。首先,
find
必须在
for
循环开始之前完成执行——没有并行操作。第二,如果有奇怪的文件名,你的
for
将完全失败。第三,很可能
find
返回的文件太多,以至于你的命令缓冲区无法运行RFlow并以静默方式删除文件名,甚至不让您知道正在发生。您可以更好地使用:

 find ... | while read something

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

我在$(查找“$SOURCE”
ls-Rl“$SOURCE”| egrep'^d'| awk'{print$9}'
-print 2>/dev/null | grep“$COPY\u PATTERN”| sed's/[0-9]\+/'uniq);在上述步骤中是的,您在for循环中使用了file,但要实际使用$file变量,必须将其用作
$file
“file”
本身只是一个字符串,其中包含一个
F
、一个
I
、一个
L
和一个
E
,而不是循环中分配给$FILE的文件名。我是在$(查找“$SOURCE”
ls-Rl“$SOURCE”| egrp'^d'| awk'{print$9}
-print 2>/dev null | grep“$COPY\u PATTERN”; sed's/[0-1249]/\uniq]中创建文件的;在上述步骤中是的,您在for循环中使用了file,但要实际使用$file变量,您必须