488
有关nas私有云的一些备份操作(shell)笔记
乐果 发表于 2023 年 12 月 12 日 标签:shell
场景一:备份电脑资料
将电脑中的某一文件(文件夹)备份到 nas
去,思路如下:
1、在本地电脑挂载 nas
的 samba
共享目录;
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