Как использовать здесь документ или назначить многострочную строку переменной в csh?

Код ошибки, возвращаемый find, не имеет никакого отношения к тому, были ли найдены какие-либо файлы. Он возвращает код ошибки только в том случае, если сама команда не выполнилась. Вам нужно что-то вроде:

while IFS=, read -r file rest
do
  find $sourcefolder -name "${file}" -exec cp '{}' $destfolder \;
  ## Check if the file was copied
  [[ -e "$destfolder/$file" ]] || echo "File $file was not copied"
done < "$csv"
echo "Finished"

Таким образом, сценарий сообщит вам о любых файлах, которые не были успешно скопированы.

Если вы хотите выводить ошибку только в конце сценария, вы можете сохранить имена неудачных файлов в переменной и вывести их после завершения цикла:

while IFS=, read -r file rest
do
  find "$sourcefolder" -name "$file" -exec cp '{}' "$destfolder" \;
  ## Check if the file was copied
  [[ -e "$destfolder/$file" ]] || badfiles=$(printf "%s\n%s" "$file" "$badfiles")
done < "$csv"

## Check if all the files were correctly copied
if [[ -z "$badfiles" ]]; then
        echo "All files were succesfuly copied."
else
        printf 'Some files were not copied:\n%s\n' "$badfiles"
fi

Вы также можете расширить это, чтобы избежать перезаписи файлов с одинаковыми именами:

while IFS=, read -r file rest
do
  find "$sourcefolder" -name "$file" -print0 |
    while IFS= read -d '' -r filepath; do
     c="";
     while [[ -e "$destfolder/$file$c" ]]; do
       ((c++))
     done
     cp "$filepath" "$destfolder/$file$c"
  done
  ## Check if the file was copied
  [[ -e "$destfolder/$file" ]] || badfiles=$(printf "%s\n%s" "$file" "$badfiles")
done < "$csv"

## Check if all the files were correctly copied
if [[ -z "$badfiles" ]]; then
        echo "All files were succesfuly copied."
else
        printf 'Some files were not copied:\n%s\n' "$badfiles"
fi

Это не сработает, если имена файлов в вашем csv могут содержать новые строки. Если это возможно, измените первый цикл while на:

while IFS= read -d"," -r file rest; do ...

Обратите внимание, однако, что это не сработает, если любая строка csv содержит только имя файла (без запятой). Если у вас есть строки без запятых, используйте первый вариант, а если у вас есть имена файлов с новыми строками, используйте второй.

3
28.05.2019, 17:08
1 ответ

Пробовали ли вы следующее?

set my_var = '\
"name":"${my_name}" \
'

, затем:

echo $my_var:q
-1
27.01.2020, 21:46

Теги

Похожие вопросы