279

有关nas私有云的一些备份操作(shell)笔记

乐果   发表于   2023 年 12 月 12 日 标签:shell

场景一:备份电脑资料

将电脑中的某一文件(文件夹)备份到 nas 去,思路如下:

1、在本地电脑挂载 nassamba 共享目录;

2、通过 rsync 同步命令,增量备份 的方式同步到上述挂载的 samba 共享目录下;

具体 shell 脚本如下:

#!/bin/bash

if [ ! -d /mnt/xiao/photo ]; then
    echo "mount samba dir from 192.168.2.200"
    mount -t cifs //192.168.2.200/xiao /mnt/xiao -o user=xiao,password=12345678,rw,file_mode=0777,dir_mode=0777
fi

if [ -d /mnt/xiao/photo ]; then
    echo "rsync photo ..."
    rsync -auv --exclude='.cache/' --exclude='.*' /data/photo /mnt/xiao/
fi

注以上脚本依赖 cifs-utils 类库,ubuntu 先安装 :

sudo apt install cifs-utils

场景二:备份苹果手机照片

苹果系统从 ios 11 版本以后的照片是 .HEIC 格式,备份思路如下:

1、先从手机中整体将照片拷贝出来:按相片的创建时间,按 年份/月份 归整 cp 到指定的文件夹下;

2、拷贝的过程中,如果文件名是.HEIC 格式,则附加一项 格式转换 的脚本任务,将.HEIC 格式转换成 .JPG 格式;

3、格式转换后,用 touch 命令将生成的.JPG 格式文件的创建时间属性保留与 .HEIC 格式源文件相同;

具体 shell 脚本如下:

#!/bin/bash

folder_path=$1

dst_folder=$2


function heic_check() {
    local file=$1
    local filename=$(basename "$file")
    if [[ "$file" == *.HEIC ]]; then
        echo "${file%.*}.jpg"
        convert "$file" -set date:create "%Y-%m-%d %H:%M:%S" "${file%.*}.JPG"
        touch -amcr $file "${file%.*}.JPG"
    fi
}

function traverse_folder() {
    local folder=$1
    if [ ! -d "$folder" ]; then
        return
    fi
    for file in "$folder"/*; do
        if [ -d "$file" ]; then
            traverse_folder "$file"
        else
            create_date=$(stat -c %y "$file" | awk '{print $1}')
            year=$(date -d "$create_date" +%Y)
            month=$(date -d "$create_date" +%m)
            mkdir -p "$dst_folder/$year/$year-$month"
            cp -p "$file" "$dst_folder/$year/$year-$month/"
            filename=$(basename "$file")
            echo "$dst_folder/$year/$year-$month/$filename"
            heic_check "$dst_folder/$year/$year-$month/$filename"
        fi
    done
}

traverse_folder "$folder_path"

场景三:找回照片的拍照时间

可能由于拷贝时照片文件时,没有保留文件的原始创建时间,但归整时需要按拍照时间建档, 思路是用 exiftool 命令来读取照片文件的元数据,找到创建时间信息。

shell案例如下:

#!/bin/bash  

folder_path=$1

dst_folder=$2

last_dst_folder=""

function mv_last_dst() {
    if [[ "$last_dst_folder" == "" ]]; then
        echo "$file can't get dst folder "
    else
        echo "$file | copy to last dst folder : $last_dst_folder/"
        cp -p "$file" "$last_dst_folder/"
    fi
}

function check_time2() {
    local file=$1
    create_date=$(exiftool -DateTimeOriginal $file | awk '{print $4}' | sed 's/:/-/g')
    create_time=$(exiftool -DateTimeOriginal $file | awk '{print $5}')
    if [[ "$create_date" == "0000-00-00" ]]; then
        echo "$file can't get create time "
    elif [[ "$create_date" == "" ]]; then
        echo "$file the create time is error 002"
        mv_last_dst $file
    else
        echo "$file | DateTimeOriginal: $create_date $create_time"
        formatted_time=$(date -d "$create_date $create_time" +%Y%m%d%H%M.%S)
        #echo "$file $formatted_time"
        touch -t $formatted_time $file
        create_date=$(stat -c %y "$file" | awk '{print $1}')
        year=$(date -d "$create_date" +%Y)
        month=$(date -d "$create_date" +%m)
        last_dst_folder="$dst_folder/$year/$year-$month"
        mkdir -p $last_dst_folder
        cp -p "$file" "$last_dst_folder/"
    fi
}

function check_time() {
    local file=$1
    create_date=$(exiftool -CreateDate $file | awk '{print $4}' | sed 's/:/-/g')
    create_time=$(exiftool -CreateDate $file | awk '{print $5}')
    if [[ "$create_date" == "0000-00-00" ]]; then
        echo "$file can't get create time "
    elif [[ "$create_date" == "" ]]; then       
        check_time2 $file
    else
        echo "$file | CreateDate: $create_date $create_time"
        formatted_time=$(date -d "$create_date $create_time" +%Y%m%d%H%M.%S)
        #echo "$file $formatted_time"
        touch -t $formatted_time $file

        create_date=$(stat -c %y "$file" | awk '{print $1}')
        year=$(date -d "$create_date" +%Y)
        month=$(date -d "$create_date" +%m)
        last_dst_folder="$dst_folder/$year/$year-$month"
        mkdir -p $last_dst_folder
        cp -p "$file" "$last_dst_folder/"
    fi
}

function traverse_folder() {
    local folder=$1
    if [ ! -d "$folder" ]; then
        return
    fi
    for file in "$folder"/*; do
        if [ -d "$file" ]; then
            traverse_folder "$file"
        else
            check_time $file
        fi
    done
}

traverse_folder "$folder_path"

场景四:文件名含有时间信息

某一些文件例如 微信 聊天录制的短视频,它的文件名称就含有创建时间的信息,归整时如何从文件名中提取所需信息。

shell 案例如下:

#!/bin/bash  

folder_path=$1

dst_folder=$2


function wx_camera() {
    local file=$1
    filename=$(basename "$file")
    if [[ "$filename" == wx_camera_* ]]; then
        echo $file
        oldIFS=$IFS
        IFS="_"
        read -ra parts <<< "$filename"
        mp4Name=${parts[2]}
        IFS=$oldIFS
        mp4Time="${mp4Name:0:10}"
        year=$(date -d @$mp4Time +%Y)
        month=$(date -d @$mp4Time +%m)
        cp_dst_folder="$dst_folder/$year/$year-$month"
        echo $cp_dst_folder
        mkdir -p $cp_dst_folder
        cp -p "$file" "$cp_dst_folder/"
    elif [[ "$filename" == TG-* ]]; then
        echo $file
        oldIFS=$IFS
        IFS="-"
        read -ra parts <<< "$filename"
        year="${parts[1]}"
        month="${parts[2]}"
        IFS=$oldIFS
        cp_dst_folder="$dst_folder/$year/$year-$month"
        echo $cp_dst_folder
        mkdir -p $cp_dst_folder
        cp -p "$file" "$cp_dst_folder/"
    elif [[ "$filename" == VID_* ]]; then
        echo $file
        oldIFS=$IFS
        IFS="_"
        read -ra parts <<< "$filename"
        mp4Name=${parts[1]}
        year="${mp4Name:0:4}"
        month="${mp4Name:4:2}"
        IFS=$oldIFS
        cp_dst_folder="$dst_folder/$year/$year-$month"
        echo $cp_dst_folder
        mkdir -p $cp_dst_folder
        cp -p "$file" "$cp_dst_folder/"
    fi
}

function traverse_folder() {
    local folder=$1
    if [ ! -d "$folder" ]; then
        return
    fi
    for file in "$folder"/*; do
        if [ -d "$file" ]; then
            traverse_folder "$file"
        else
            wx_camera $file
        fi
    done
}

乐果   发表于   2023 年 12 月 12 日 标签:shell

0

文章评论