سؤال كيف تنسخ كل يوم إلى وجهتين أخريين؟


كيف نفعل ذلك مع كرون؟

  • اليوم: cp * ~/destination.0
  • غدا: cp * ~/destination.1
  • اليوم التالي: cp * ~/destination.0
  • اليوم التالي: cp * ~/destination.1

...وما إلى ذلك وهلم جرا.

أي مساعدة سيكون موضع تقدير كبير!


7
2017-12-01 12:54


الأصل


قد تكون مهتمًا أيضًا باستخدام rsync بدلا من cp، والتي لديها مزايا مثل عدم الكتابة فوق الملفات التي لم يتم تغييرها (لذلك يمكن أن يكون أسرع بكثير اعتمادا على مقدار ما تقوم بنسخه) والحفاظ على طوابع زمنية للملفات. - drewbenn
نعم ، سأستخدم rsync ، cp لمجرد المثال - Stefan


الأجوبة:


بطانة واحدة:

0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))

تفسير:

$(( $(date -d 0:00 +%s)/(3600*24) % 2))
  • سيعيد الطابع الزمني في ثوانٍ (+%s) من اليوم الساعة 0:00 (-d 0:00).
  • مقسوم على (3600*24) سيعود عدد الأيام من عصر يونكس.
  • %2 سيعود 0 أو 1 للأيام الفردية أو حتى منذ بداية عهد unix.

6
2017-12-01 13:43



% 2 هي عملية modulo بسيطة ، والتي تُرجع 1 إذا كان رقم الأيام المعطى لها هو odd و 0 إذا كان كذلك. - Videonauth
+1 للحل باستخدام seconds since 1970-01-01 00:00:00 UTC  اختيار. بهذه الطريقة لا تحتاج إلى التفكير في مشكلة 30/31 يوم / شهر لمحاولات أخرى هنا - derHugo
RoVo هذا بالضبط ما كنت أبحث عنه بسبب اليومين الغريبين 31 و 1! ذكي جدا! - Stefan
يمكنك أيضًا التخلص من المكالمة المتداخلة $(date +%F) من خلال وصف منتصف الليل مثل: date -d "12am today" +%s (أو -d 00:00 إذا كان هذا يجعلك أكثر راحة). - drewbenn
صحيح. أنا updatet الجواب. - RoVo


إذا كان من الأفضل الكتابة ~/destination.0 على حتى التواريخ و ~/destination.1 في التواريخ الفردية ، يجب أن يعمل خط crontab التالي. ويبدأ النسخ الاحتياطي في منتصف الليل (0 دقيقة ، 0 ساعة ، والعناصر الأولى على السطر) ،

0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

انظر هذا الرابط للحصول على شرح لبناء الجملة crontab ،

جدولة المهام مع وظائف كرون

اختبار جزء الأمر من الخط في نافذة طرفية ،

echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

وعندما تعمل ، يمكنك استبدال cd dir2copy مع cd to-the-actual-directory-you-want-to-copy، يحل محل ~ مع /home/your-home-directory وإزالة الاثنين echo الكلمات لجعلها تقوم بالمهمة الحقيقية.

اختباره مرة أخرى ، ثم قم بتعديل خط crontab. (البيئة في crontab قد تحتاج إلى مسارات كاملة صريحة إلى البرامج والدلائل وملفات البيانات.)


/bin/date '+%d' يجد يوم من الشهر و % هي عملية الباقي ، التي تنتج 0 أو 1، والذي يتم إلحاقه في نهاية سطر الأوامر.

قد تفضل /bin/date '+%j'، التي تجد اليوم من العام ، على سبيل المثال اليوم ، 1 ديسمبر ، هو اليوم #335.


3
2017-12-01 13:49



لن يتبادل بين اليوم 365 و 1. - RoVo
نعم ، أنت على حقRoVo. لقد لاحظت ، أنك قمت بإصلاح ذلك ، وسأقوم بتقييم إجابتك: -) لقد أنفقت مجهودًا أكثر مما كنت أجعل الأشياء تعمل تمامًا وفقًا للمواصفات في السؤال. سيكون من الرائع بالنسبة لي في العام الجديد أن يتخلى هذا التناوب. قد يتم إيقاف تشغيل الكمبيوتر الخاص بي على أي حال ؛-) - sudodus
صحيح ، لكني بدأت بنفس المشكلة ... +%w: اللعنة في الأسبوع لديه عدد فردي من أيام ... ثم +%d، ثم +%j... ثم ... القرف أنا مارس الجنس ... - RoVo
على أي حال بعد سنة كبيسة +%j ستعمل بشكل صحيح على السنة الجديدة ^^ - RoVo
لا إذا كانت سنة كبيسة %100 : P - derHugo


أنا أتفق مع "تشغيل cronjob يوميا ، تبديل الدلائل في البرنامج النصي" إجابات ، ولكن سأفعل ذلك على النحو التالي:

#!/bin/bash 
# use hidden link
last=$HOME/.last_destination
#
declare -a dirs
dirs[0]="destination.0"
dirs[1]="destination.1"
#
target=
#
# If $last is a link, it points to the last used directory. Otherwise,
# initialize it and use $HOME/destination.0
if [[ -L "$last" ]] ; then
    # get the name of the linked dir
    old="$(stat  --printf="%N" "$last" | cut -d\' -f4)"
    if [[ "$old" == "${dirs[0]}" ]] ; then
        target="${dirs[1]}"
    else
        target="${dirs[0]}"
    fi
else
    # "$last" is not a link - first time initialization
    target="${dirs[0]}"
fi
# now, with $target set, point the $last link at $target, for next time
rm "$last"
ln -s "$target" "$last"
#
# debugging printouts - remove in real life
echo "$target"
ls -l "$last"

2
2017-12-01 18:22





قم بتشغيل هذا البرنامج النصي يوميًا من cron:

#! / بن / ش
مجموعة-
cp * ~ / destination.0
mv ~ / destination.0 ~ / destination.last
mv ~ / destination.1 ~ / destination.0
mv ~ / destination.last ~ / destination.0

0
2017-12-01 13:39



أنت لا تكتب أي شيء إلى ~/destination.1... - derHugo
صحيح ، هناك خطأ في البرنامج النصي (غير المختبر) ، يجب إعادة تسمية السطر الأخير * .last إلى * .1 بدلاً من * .0 ... وفي نفس الوقت رأيت حلولاً أفضل تتضمن حسابات modulo 2 - Luc Moreau
حتى من أن تنسخ كل يوم destination.1 و لدي destination.0 كنسخة احتياطية .. لكن actualy لا يتناوب بين وجهتين. - derHugo