Код ошибки, возвращаемый 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 содержит только имя файла (без запятой). Если у вас есть строки без запятых, используйте первый вариант, а если у вас есть имена файлов с новыми строками, используйте второй.
Пробовали ли вы следующее?
set my_var = '\
"name":"${my_name}" \
'
, затем:
echo $my_var:q