Рабочая человечность 16.04
Обновление: Я закончил сообщения об ошибках двойным заключением в кавычки переменных:
cp -ru "$line" "$destname"
Но это ничего все еще не копирует. После добавления echo $?
после строки выше, я добираюсь 0.
Замена cp
с ls -l
содержание списков каталогов.
Код:
[ $# -eq 0 ] && { echo "Usage: $0 m/d/yyyy"; exit 1; }
DestDir=/media/WD_NAS_LEW/grsync
find Documents -type f -newermt $1 > mybackup.log
awk 'BEGIN{FS=OFS="/"}{NF--; print}' mybackup.log | while read line
do
destname=$DestDir/$line
cp -ru $line $destname
done
#rm mybackup.log
echo Done
Вывод сценария - и файлы не копируется для строк без ошибок ниже:
$ ./mybackup.sh 8/20/2018
cp: target 'Card/Documents' is not a directory
cp: target 'Lessons' is not a directory
cp: target 'Lessons' is not a directory
cp: target 'Letters' is not a directory
cp: target 'Asia' is not a directory
cp: target 'Procedures' is not a directory
Done
Исходные данные: содержание mybackup.log (полный путь с именем файла):
Documents/Phone/Phone Main Memory Card/Documents/misc.doc
Documents/Lew/PFinc/Bills N Balances.ods
Documents/Lew/Trading/Market Review.odt
Documents/Lew/Trading/Trade Tools.ods
Documents/Lew/Trading/Studies & Lessons/Summary Technical Analysis.odt
Documents/Lew/Trading/Studies & Lessons/Paper calendars and diagonals.odt
Documents/Lew/Trading/Paper Trades.ods
Documents/Lew/Trading/DVL/thinkscript/Mark_Volume_SpikeSTUDY.ts
Documents/Lew/General/Essays & Letters/0 RFR.odt
Documents/Lew/General/Long Fist et al Asia/Long Tai Chi.odt
Documents/Lew/General/Technology/Backup Procedures/find files since X for manual backup.png
Documents/Kids/Carey/Carey August 2018.odt
Documents/Kids/Renee/birth certif and social Stella.pdf
Documents/Kids/Renee/Noah/Noah Confucius tenets.odt
вывод awk (исходный dir только, никакое запаздывание "/"; конечным диском является Western Digital mybook NAS):
/media/WD_NAS_LEW/grsync/Documents/Phone/Phone Main Memory Card/Documents
/media/WD_NAS_LEW/grsync/Documents/Lew/PFinc
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading/Studies & Lessons
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading/Studies & Lessons
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading/DVL/thinkscript
/media/WD_NAS_LEW/grsync/Documents/Lew/General/Essays & Letters
/media/WD_NAS_LEW/grsync/Documents/Lew/General/Long Fist et al Asia
/media/WD_NAS_LEW/grsync/Documents/Lew/General/Technology/Backup Procedures
/media/WD_NAS_LEW/grsync/Documents/Kids/Carey
/media/WD_NAS_LEW/grsync/Documents/Kids/Renee
/media/WD_NAS_LEW/grsync/Documents/Kids/Renee/Noah
Это, кажется, изменяет разделитель полей. Я должен вынуть пробелы на имена dir или там способ оставить их?
Если у Вас есть имя файла с пространством в нем, большинство команд интерпретирует его как два имен файлов. Например, если у Вас есть файл, названный "мой файл", и Вы пытаетесь скопировать его в/tmp следующим образом:
cp my file /tmp
команда CP будет искать два файла (Названный my
и file
- если они не будут существовать, то это перестанет работать).
Для преодоления этого поместите кавычки вокруг имени файла:
cp "my file" /tmp
необходимо сделать то же в сценарии
cp -ru "$line" "$destname"
(удар все еще развернет имена переменной в двойных кавычках, но не одинарные кавычки),
У меня нет кобылы, проверил Ваш сценарий - могут быть другие места, где необходимо заключить имена переменной в кавычки.
btw - существует много комментариев об использовании rsync. После того как Вы привыкаете к нему, это - намного более хороший способ создать резервную копию!