옵션 및 옵션 rsync
과 함께 작동하는 실행용 bash 함수를 작성 중입니다 . 몇 가지 중요한 개선과 추가 검사가 필요합니다.--dry-run
--exec
--dry-run
사용자 사양의 경우 아마도 별 의미가 없을 것입니다 --exec
. 어쨌든 --dry-run을 사용하겠습니다.
다음 설정이 시작되었습니다.
다음 전화
filetr-archive -n -s bkscan -d temp
명령 실행
rsync -av --progress --dry-run --log-file=temp/bkscan.log bkscan temp
이렇게 하면 temp/bkscan.log
파일의 내용이
2021/07/19 23:55:15 [19947] building file list
2021/07/19 23:55:15 [19947] cd+++++++++ bkscan/
2021/07/19 23:55:15 [19947] sent 273 bytes received 56 bytes 658.00 bytes/sec
2021/07/19 23:55:15 [19947] total size is 108,837,826 speedup is 330,814.06 (DRY RUN)
그러나 rsync
다음도 생성되지만 저장되지는 않습니다. rsync
터미널에 표시된 출력이 유용합니까? 정보를 저장할 수도 있습니다. 하지만 어떻게 할 수 있는지 알고 싶습니다.
bkscan temp
sending incremental file list
bkscan/
bkscan/BkScan.aux
bkscan/BkScan.cp
bkscan/BkScan.fn
bkscan/BkScan.ky
bkscan/BkScan.log
bkscan/BkScan.pdf
bkscan/BkScan.pg
bkscan/BkScan.texi
bkscan/BkScan.texi~
bkscan/BkScan.tp
bkscan/BkScan.vr
bkscan/BookScan.texi~
sent 273 bytes received 56 bytes 658.00 bytes/sec
total size is 108,837,826 speedup is 330,814.06 (DRY RUN)
filetr-archive ()
{
# Process command line options
shortopts="nel:s:d:"
longopts="dry-run,exec,log:,source:,destin:"
opts=$(getopt -o "$shortopts" -l "$longopts" \
-n "$(basename $0)" -- "$@")
if [ $? -eq 0 ]; then
eval "set -- ${opts}"
while [ $# -gt 0 ]; do
case "$1" in
-n|--dry-run)
shift 1
local -r dryrun=1
;;
-e|--exec)
shift 1
local -r exec=1
;;
-l|--log)
local logfl=$2
shift 2
;;
-s|--source)
local source=$2
shift 2
;;
-d|--destin)
local destin=$2
shift 2
;;
--)
shift; break ;;
esac
done
else
shorthelp=1 # getopt returned (and reported) an error.
fi
if (( filetr_dryrun == 1 )); then
echo "rsync -av --progress --log-file=$logfl --dry-run"
echo " $source $destin"
rsync -av --progress --log-file=$logfl --dry-run $source $destin
elif (( filetr_exec == 1 )); then
# use rsync archive option -a (equivalent to -rlptgoD)
echo "rsync -av --progress --log-file=$logfl $source $destin"
# rsync -av --progress --log-file=$logfl $source $destin
else
echo "rsync -av --progress --log-file=$logfl $source $destin"
fi
답변1
rsync -av --progress --log-file=$logfl --dry-run $source $destin
이것필요큰따옴표(예: --log-file="$logfl" --dry-run "$source" "$destin"
참조)언제 큰따옴표가 필요합니까?그리고http://mywiki.wooledge.org/WordSplitting
local logfl=$2
이것은 아마도 큰따옴표를 사용해야 할 것입니다. 단순 할당( 또는 다른 것이 logfl=$2
없음 local
)은 필요하지 않은 경우 중 하나이지만 , 등의 경우에는 local
그렇게 export
명확 readonly
하지 않습니다. 문제가 발생하지 않도록 거기에 따옴표를 넣으십시오.
if (( filetr_dryrun == 1 )); then
...
rsync -av --progress --log-file=$logfl --dry-run $source $destin
elif (( filetr_exec == 1 )); then
...
rsync -av --progress --log-file=$logfl $source $destin
-av
여기에 코드를 복사하면 , --progress
, $source
, 모두 $destin
두 브랜치에서 동일합니다. 이를 피하는 것이 가장 좋으며 Bash를 실행하고 있으므로 인수를 배열로 수집할 수 있습니다. 다음을 참조하세요.조건부로 인수를 스크립트에 전달
filetr-archive ()
대시는 Bash 및 Zsh에서 함수 이름의 일부이지만 Ksh 또는 Dash에서는 그렇지 않습니다. 따라서 이식성을 위해 밑줄을 사용하는 것이 더 합리적일 수 있습니다. 물론, 어쨌든 POSIX가 아닌 항목을 사용하고 있으므로 (( .. ))
적어도 의식적으로 Dash를 무시하고 싶을 것입니다.