2013-07-08 2 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; 

Я запускаю его на cygwin на окнах.

Но я получаю ниже ошибки ф не может стат файлу нет такого файла или каталога

Пожалуйста, помогите мне выяснить это.

Спасибо, Том

ответ

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 является отладчик для оболочки. Он печатает строку, выполняемую, как написано в вашем сценарии оболочки, а затем печатает строку после того, как были сделаны все переменные интерполяции. Это позволит вам увидеть каждый набор, который принимает ваша программа, и где у него могут быть проблемы. set +xv просто отключает отладку.

Я подозреваю, что проблема в cp -f "FILE" "$WORKING" линии, потому что файл FILE на самом деле не существует. Я также подозреваю, что вы собираете имена файлов (и копирование там не работает), и вы, возможно, не проверяете, действительно ли существуют каталоги до того, как вы скопируете туда файлы. Используйте set -o xv, и вы увидите довольно много этих ошибок.

Ввод cp в операторе echo также позволит вам увидеть, что вы планируете выполнять до его фактического выполнения. Это еще один способ помочь отлаживать сценарии оболочки.

Я также подозреваю, что ваш цикл for может не делать именно то, что вы хотите. Это слишком сложный плохой мальчик, в котором вы выполняете сразу две команды суб-оболочки. (После использования $(..) и другого использования обратных тиков. Я категорически против использования 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 "$ COPY_PATTERN "| sed 's/_ [0-9] \ + //' | uniq); на вышеуказанном этапе – tom

+0

да, вы использовали файл в цикле for, но на самом деле ** ИСПОЛЬЗУЙТЕ ** переменную $ FILE, вы должны использовать ее как '$ FILE'. '' FILE "' сам по себе - это просто строка, содержащая 'F',' I', 'L' и' E', а не имя файла, которое было присвоено $ FILE в цикле. –

0

имена переменных окружения чувствительны к регистру в Cygwin (как и во всех оболочках POSIX, и в отличие от Windows), так $Copy_Pattern (устанавливается в P0689|P1391|P0730) и $COPY_PATTERN (не определен) две разные переменные.

Вы должны также знать о командной строке -x в bash, которая запустит ваш скрипт в режиме трассировки. Это очень полезно при отладке сценария bash, и я уверен, что это поможет вам найти проблему.

Смежные вопросы