Кто-то дал этот скрипт для ротации логов. Я хочу знать, какая логика за этим стоит. Хотя я понимаю все, кроме --exec, что меня немного смутило.
Оригинальный сценарий:
#!/bin/bash
set -x
NOW=$(date +"%m-%d-%Y")
echo $
cd /home/cloud360mssadmin/
find Tahoe-Broadcast.log.* -exec sh -c 'mv "$0" "/home/cloud360mssread/$0-`date +"%d-%m-%Y"`"' {} \;
Я думаю, что в «echo $» отсутствует переменная.
Тот же скрипт, который я реализовал другим способом (только в целях тестирования), был успешно выполнен.
#!/bin/bash
# this is scrpt for the log rotation
set -x
cd /var/log
echo " we are enter the `pwd`"
NOW="$(date +'%d-%m-%y')"
echo $NOW
find vmware* -exec mv '{}' /home/vinod/ \;
cd /home/vinod/
find vmware* -exec tar -rvf vmware.tar {} \;
Моя задача — повернуть бревно и сжать его.
решение1
Пытаться:
sh -c 'echo 0:$0, 1:$1, 2:$2' one two three
это дает:
0:one, 1:two, 2:three
Другими словами, sh -c
запускает временный скрипт ( echo 0:$0, 1:$1, 2:$2
), который получает остальные аргументы в sh
качестве своих собственных аргументов. Обычно предполагается, что первый из этих аргументов является именем команды (но это соглашение).
Итак, в вашем сценарии:
-exec sh -c 'mv "$0" "/home/cloud360mssread/$0-`date +"%d-%m-%Y"`"' {} \;
выполняет:
mv {the_file} /home/cloud360mssread/{the_file}-{timestamp}
что немного надуманно, поскольку:
-exec mv "{}" "/home/cloud360mssread/{}-$(date +"%d-%m-%Y")" \;
сработало бы так же хорошо.