Могу ли я сделать небольшую рекомендацию:
#!/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
будет работать в.
Я сделал FILE в $ (найти "SOURCE" 'ls -Rl" $ SOURCE "| egrep '^ d' | awk '{print $ 9}'' -print 2>/dev/null | grep "$ COPY_PATTERN "| sed 's/_ [0-9] \ + //' | uniq); на вышеуказанном этапе – tom
да, вы использовали файл в цикле for, но на самом деле ** ИСПОЛЬЗУЙТЕ ** переменную $ FILE, вы должны использовать ее как '$ FILE'. '' FILE "' сам по себе - это просто строка, содержащая 'F',' I', 'L' и' E', а не имя файла, которое было присвоено $ FILE в цикле. –