diff --git a/README.md b/README.md deleted file mode 100644 index e101d2f..0000000 --- a/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Backup_script 數據備份腳本 -![主圖](https://github.com/Petit-Abba/backup_script_zh-CN/blob/main/File/mmexport1631297795059.png) -[![Stars](https://img.shields.io/github/stars/YAWAsau/backup_script?label=stars)](https://github.com/YAWAsau) -[![Download](https://img.shields.io/github/downloads/YAWAsau/backup_script/total)](https://github.com/YAWAsau/backup_script/releases) -[![Release](https://img.shields.io/github/v/release/YAWAsau/backup_script?label=release)](https://github.com/YAWAsau/backup_script/releases/latest) -[![License](https://img.shields.io/github/license/YAWAsau/backup_script?label=License)](https://choosealicense.com/licenses/gpl-3.0) - - -## 概述 - -創作該腳本是為了使用戶能夠更加完整地**備份/恢復**應用數據, -支援設備必須符合以下條件:`Android 8+`+`arm64`。 - -由於本人是台灣人所以發布的版本為繁體版,如果需要**简体版**,可前往這裡下載: -> 简体中文版:[backup_script_zh-CN](https://github.com/Petit-Abba/backup_script_zh-CN) 。 - -PS. 簡體版本使用 Github Action 自動構建,30分鐘執行一次,所以在原倉庫發布新 release 後,不會立馬更新简体版。 - -## 優勢 - -- 數據完整:在更換系統之後,原有的數據全部保留,無需重新登陸或者下載額外數據包。 -- 易操作:簡單几步即可備份應用完整數據! -- 限制少:不限制機型,可跨安桌版本。 -- 功能強:可備份恢復`split apk`。 -- 算法多:目前支持的壓縮算法有 `tar(默認)` `lz4` `zstd`。 -- 速度快:即使使用`zstd`壓縮算法速率依舊快速(對比鈦備份 swift)。 - -## 如何使用 -`請認真閱讀以下說明,以減少不必要的問題` - -##### 推薦工具:[`MT管理器`](https://www.coolapk.com/apk/bin.mt.plus),若使用`Termux`,則請勿使用`tsu`。 - -#### !!!以下操作皆須ROOT!!! #### - -1. 首先將下載到的`數據備份脚本.zip`解壓到任意目錄後,可以看到以下幾個文件與一個 目錄:`生成應用列表.sh` `backup_settings.conf` `備份應用.sh` `tools` `備份自定義資料夾.sh` `終止腳本.sh` `警告! 不論備份或是恢復都必須保證tools的存在與完整性 否則腳本失效或是二進制調用失敗`。 - -2. 然後執行`生成應用列表.sh`腳本,並等待腳本輸出結束[[示意圖]](https://raw.githubusercontent.com/YAWAsau/backup_script/0a08a49865fd9ec36d4fedd3e76ec68f841ff1d7/DCIM/Screenshot_20211230-185717_MT%E7%AE%A1%E7%90%86%E5%99%A8-01.jpeg),再等待提示結束 [[示意圖]](https://raw.githubusercontent.com/YAWAsau/backup_script/master/DCIM/Screenshot_20211230-190000_MT%E7%AE%A1%E7%90%86%E5%99%A8-01.jpeg) [[示意圖]](https://raw.githubusercontent.com/YAWAsau/backup_script/master/DCIM/Screenshot_20211230-185941_MT%E7%AE%A1%E7%90%86%E5%99%A8-01.jpeg),此時會在當前目錄生成一個`appList.txt`,這就是你當前安裝的所有第三方應用。 - -3. 現在打開生成的`appList.txt`,根據裏面的提示操作後保存[[示意圖]](https://github.com/Petit-Abba/backup_script_zh-CN//raw/main/File/Picture/3.png),這樣你就設置好了需要備份的軟件。 - -4. 最後找到`backup_settings.conf`打開[[示意圖]](https://raw.githubusercontent.com/YAWAsau/backup_script/master/DCIM/Screenshot_20211230-191248_MT%E7%AE%A1%E7%90%86%E5%99%A8-01.jpeg),再打開`備份應用.sh`,等候備份結束。完成後會在當前目錄生成一個以`Backup_壓縮算法名`命名的資料夾,裡面就是你的軟件備份。把這個資料夾整個保持到其他位置,刷完機后複製回手機,直接在資料夾裡找到`恢復備份.sh`即可恢復備份的所有數據,同樣道理,裡面也有個`appList.txt`,使用方法跟第3步驟一樣,不需要還原的刪除即可。 - - ##### 附加說明:如何恢復 以下是關於恢復資料夾內的文件說明? -``` -1. 找到恢復資料夾內的appList.txt打開 編輯列表 保存退出 - -2. 找到恢復備份.sh 給予root後等待腳本結束即可 - -3. 重新生成應用列表.sh可用於刷新appList.txt內的列表 使用時機為當你刪除列表內的任何應用備份時,抑或者是恢復備份.sh提示列表錯誤時 - -4. 終止腳本.sh用於突然想要終止腳本或是意外操場時使用 同理備份資料夾也有一個,因為腳本無須後台特性不能使用常規手段終結,故此另外寫了一個腳本終止 -``` -# 關於如何更新腳本? -- 目前有三種更新方法,有下列方式 -- 1.手動將下載的備份腳本zip不解壓縮直接放到腳本任意目錄(不包括tools目錄內)的任意地方執行任何腳本即可更新,腳本將提示 -- 2.此備份的任何腳本在執行時均會聯網檢測腳本版本,當更新時會自己提示與下載,根據腳本提示操作的即可 -- 3.將下載的壓縮包不解壓縮直接放在/storage/emulated/0/Download腳本自動檢測更新,並按照提示操作即可 - -## 關於反饋 -- 如果使用過程中出現問題,請攜帶截圖並詳細說明問題,建立 [issues](https://github.com/YAWAsau/backup_script/issues)。 -- 酷安 @[落葉淒涼TEL](http://www.coolapk.com/u/2277637) -- QQ組 976613477 -- TG https://t.me/backup_script - -## 常見問題 -``` -Q1:批量備份大量提示失敗怎麼辦? -A1:退出腳本,刪除/data/backup_tools,再備份一次 - -Q2:批量恢復大量提示失敗怎麼辦? -A2:退出腳本,按照上面同樣操作。 如果還是錯誤,請建立issues,我幫你排除錯誤 - -Q3:微信/QQ 能不能完美備份&恢復數據? -A3:不能保證,有的人說不能有的人說能,所以備份會有提示。 建議用你信賴的備份軟件針對微信/QQ再備份一次,以防丟失重要數據 - -Q4:為什麼部分應用備份很久? 例如王者榮耀、PUBG、原神、微信、QQ。 -A4:因為連同軟件數據包都給你備份了,例如原神數據包9GB+,當然久到裂開了,恢復也是同理,還要解壓縮數據包 -``` - -## 銘謝貢獻 -- 臭批老k([kmou424](https://github.com/kmou424)):提供部分與驗證函數思路 -- 屑老方([雄氏老方](http://www.coolapk.com/u/665894)):提供自動更新腳本方案 -- 依心所言&情非得已c:提供appinfo替代aapt作為更高效的dump包名 -- 胖子老陳(雨季騷年) -- XayahSuSuSu([XayahSuSuSu](https://github.com/XayahSuSuSu)):提供App支持 -`文檔編輯:Petit-Abba, YuKongA` diff --git a/backup_settings.conf b/backup_settings.conf index 43d90e8..770a882 100644 --- a/backup_settings.conf +++ b/backup_settings.conf @@ -3,9 +3,12 @@ #如果是那下面三項設置就被忽略,改為音量鍵選擇 Lo=0 -#備份時檢查資料夾是否存在已經卸載應用 有則音量鍵選擇刪除或是移動到恢復資料夾/被卸載的應用 +#備份時檢查資料夾是否存在已經卸載應用 delete_folder=1 +#存在已卸載應用操作(1刪除0移動) +default_behavior=0 + #自定義備份目錄輸出位置 (忽略為空將默認腳本路徑中) Output_path= @@ -39,8 +42,8 @@ debug_list=0 #添加自定義備份路徑 請勿刪除" " Custom_path=" /storage/emulated/0/Pictures -/storage/emulated/0/Download -/storage/emulated/0/Music +#/storage/emulated/0/Download +#/storage/emulated/0/Music /storage/emulated/0/DCIM " @@ -84,4 +87,4 @@ Compression_method=zstd rgb_a=190 #輔色 rgb_b=123 -rgb_c=177 \ No newline at end of file +rgb_c=177 diff --git a/tools/bin/backup_tar b/tools/bin/backup_tar deleted file mode 100644 index cd95bd5..0000000 Binary files a/tools/bin/backup_tar and /dev/null differ diff --git a/tools/bin/backup_zstd b/tools/bin/backup_zstd deleted file mode 100644 index fcc0019..0000000 Binary files a/tools/bin/backup_zstd and /dev/null differ diff --git a/tools/bin/bin.sh b/tools/bin/bin.sh index c3b7416..f3e6114 100644 --- a/tools/bin/bin.sh +++ b/tools/bin/bin.sh @@ -11,7 +11,7 @@ echoRgb() { else echo -e "\e[38;5;${rgb_a}m -$1\e[0m" fi - [[ $Status_log != "" ]] && echo " -$(date '+%T') $1" >>"$Status_log" + #[[ $Status_log != "" ]] && echo " -$(date '+%T') $1" >>"$Status_log" } [ "$rgb_a" = "" ] && rgb_a=214 if [ "$(whoami)" != root ]; then @@ -21,7 +21,6 @@ fi abi="$(getprop ro.product.cpu.abi)" case $abi in arm64*) - ARCH=arm64 if [[ $(getprop ro.build.version.sdk) -lt 24 ]]; then echoRgb "設備Android $(getprop ro.build.version.release)版本過低 請升級至Android 8+" "0" exit 1 @@ -49,15 +48,15 @@ else echo "Magisk busybox Path does not exist" fi export PATH="$PATH" -backup_version="V15.6.4" +backup_version="V15.6.5" #設置二進制命令目錄位置 if [[ $bin_path = "" ]]; then echoRgb "未正確指定bin.sh位置" "0" exit 2 fi #bin_path="${bin_path/'/storage/emulated/'/'/data/media/'}" -Status_log="$MODDIR/Log.txt" -rm -rf "$Status_log" +#Status_log="$MODDIR/Log.txt" +#rm -rf "$Status_log" filepath="/data/backup_tools" busybox="$filepath/busybox" busybox2="$bin_path/busybox" @@ -236,13 +235,7 @@ update_script() { case $(echo "$zipFile" | wc -l) in 1) if [[ $(unzip -l "$zipFile" | awk '{print $4}' | egrep -o "^backup_settings.conf$") = "" ]]; then - if [[ $(unzip -l "$zipFile" | awk '{print $4}' | egrep -o "^music.apk$") != "" ]]; then - echoRgb "發現YTmusic模塊" "1" - elif [[ $(unzip -l "$zipFile" | awk '{print $4}' | egrep -o "^revanced.apk$") != "" ]]; then - echoRgb "發現YouTube模塊" "1" - else - echoRgb "${zipFile##*/}並非指定的備份zip,請刪除後重新放置\n -何謂更新zip? 就是GitHub release頁面下載的zip" "0" - fi + echoRgb "${zipFile##*/}並非指定的備份zip,請刪除後重新放置\n -何謂更新zip? 就是GitHub release頁面下載的zip" "0" else unzip -o "$zipFile" -j "tools/bin/bin.sh" -d "$MODDIR" &>/dev/null if [[ $(expr "$(echo "$backup_version" | tr -d "a-zA-Z")" \> "$(cat "$MODDIR/bin.sh" | awk '/backup_version/{print $1}' | cut -f2 -d '=' | head -1 | sed 's/\"//g' | tr -d "a-zA-Z")") -eq 0 ]]; then @@ -367,19 +360,8 @@ update_script() { fi ;; *) - echo "$zipFile" | while read ; do - if [[ $(unzip -l "$REPLY" | awk '{print $4}' | egrep -o "^music.apk$") != "" ]]; then - echoRgb "發現YTmusic模塊" "1" && touch "$TMPDIR/OLK" - elif [[ $(unzip -l "$REPLY" | awk '{print $4}' | egrep -o "^revanced.apk$") != "" ]]; then - echoRgb "發現YouTube模塊" "1" && touch "$TMPDIR/OLK" - fi - done - if [[ ! -e $TMPDIR/OLK ]]; then - echoRgb "錯誤 請刪除當前目錄多餘zip\n -保留一個最新的數據備份.zip\n -下列為當前目錄zip\n$zipFile" "0" - exit 1 - else - rm -rf "$TMPDIR/OLK" - fi + echoRgb "錯誤 請刪除當前目錄多餘zip\n -保留一個最新的數據備份.zip\n -下列為當前目錄zip\n$zipFile" "0" + exit 1 ;; esac fi diff --git a/tools/bin/curl b/tools/bin/curl index 88ff07f..80472e7 100644 Binary files a/tools/bin/curl and b/tools/bin/curl differ diff --git a/tools/bin/tools.sh b/tools/bin/tools.sh index 14877a0..9eed3fc 100644 --- a/tools/bin/tools.sh +++ b/tools/bin/tools.sh @@ -17,9 +17,9 @@ fi [[ $conf_path != "" ]] && conf_path="$conf_path" || conf_path="$MODDIR/backup_settings.conf" [[ ! -f $conf_path ]] && echo "$conf_path配置遺失" && EXIT="true" [[ $EXIT = true ]] && exit 1 -. "$conf_path" -. "$bin_path/bin.sh" echo "$(sed 's/true/1/g ; s/false/0/g' "$conf_path")">"$conf_path" +. "$conf_path" &>/dev/null +. "$bin_path/bin.sh" [[ $user = "" ]] && user=0 path="/data/media/$user/Android" path2="/data/user/$user" @@ -54,7 +54,7 @@ backup|Restore|Restore2|Getlist) pm enable "ice.message" &>/dev/null if [[ $(pm path --user "$user" ice.message 2>/dev/null) = "" ]]; then echoRgb "未安裝toast 開始安裝" "0" - if [[ ! -d $tools_path/apk ]] ; then + if [[ -d $tools_path/apk ]] ; then cp -r "${bin_path%/*}/apk"/*.apk "$TMPDIR" && INSTALL "$TMPDIR"/*.apk &>/dev/null && rm -rf "$TMPDIR"/* [[ $? = 0 ]] && echoRgb "安裝toast成功" "1" || echoRgb "安裝toast失敗" "0" else @@ -183,75 +183,6 @@ if [[ $json != "" ]]; then fi fi Lo="$(echo "$Lo" | sed 's/true/1/g ; s/false/0/g')" -install_YT() { - ls -t "$MODDIR"/*.zip &>/dev/bull | while read ; do - unset model PKG apkname - if [[ $(unzip -l "$REPLY" | awk '{print $4}' | egrep -o "^music.apk$") != "" ]]; then - model=YouTubeMusic - PKG=com.google.android.apps.youtube.music - apkname=music.apk - else - if [[ $(unzip -l "$REPLY" | awk '{print $4}' | egrep -o "^revanced.apk$") != "" ]]; then - model=YouTube - PKG=com.google.android.youtube - apkname=revanced.apk - fi - fi - if [[ $model != "" ]]; then - echoRgb "安裝Re $model" "1" - modules_path="/data/adb/modules/$model" - app_path="$(pm path "$PKG" | grep -v '/data/app/' | sed 's/package://g')" - rm -rf "$modules_path" &>/dev/null - [[ ! -d $modules_path ]] && mkdir -p "$modules_path" - [[ $app_path != "" ]] && File_Dir="$modules_path/system/${app_path%/*}" || File_Dir="$modules_path/system/priv-app" - mkdir -p "$File_Dir" - touch "$File_Dir/.replace" - chown root:root "$File_Dir/.replace" - [[ ! -d $modules_path/system/etc/permissions ]] && mkdir -p "$modules_path/system/etc/permissions" - unzip -o "$REPLY" -j bin/sqlite3_arm64-v8a -d "$modules_path/bin" &>/dev/null - unzip -o "$REPLY" -j system/priv-app/* -d "$File_Dir" &>/dev/null - if [[ $app_path = "" ]]; then - if [[ $(pm path "$PKG" | sed 's/package://g') = "" ]]; then - echoRgb "install $model apk" - cp -r "$File_Dir/"*.apk "$TMPDIR" && INSTALL "$TMPDIR"/*.apk &>/dev/null && rm -rf "$TMPDIR"/* - fi - fi - unzip -o "$REPLY" -j system/etc/permissions/* -d "$modules_path/system/etc/permissions" &>/dev/null - ln -sfT "$modules_path/bin/sqlite3_arm64-v8a" "$modules_path/bin/sqlite3" - unzip -o "$REPLY" -j "$apkname" -d "$modules_path" &>/dev/null - unzip -o "$File_Dir/base.apk" lib/$abi/* -d "$File_Dir" &>/dev/null - find "$modules_path" -type d | while read ;do - chmod 755 "$REPLY" - done - find "$modules_path" -type f | while read ;do - chmod 644 "$REPLY" - done - echo '#!/system/bin/sh\nMODDIR="${0%/*}"'>"$modules_path/service.sh" - echo 'while [[ "$(getprop sys.boot_completed | tr -d '\r')" != "1" ]]; do sleep 1; done'>>"$modules_path/service.sh" - echo "base_path=\"$modules_path/$apkname\"\nstock_path=\"\$(pm path "$PKG" | head -1 | sed 's/package://g')\"\numount -l \"\$stock_path\"\nchmod 666 \"\$base_path\"\nchcon u:object_r:system_file:s0 \"\$base_path\"\nmount -o bind \"\$base_path\" \"\$stock_path\"">>"$modules_path/service.sh" - echo "PS=com.android.vending\ncmd appops set --uid \"\$PS\" GET_USAGE_STATS ignore -for user_id in \$(ls /data/user); do - pm disable --user \"\$user_id\" \"\$PS\" - \"\$MODDIR/bin/sqlite3\" \"/data/user/\$user_id/\$PS/databases/library.db\" \"UPDATE ownership SET doc_type = '25' WHERE doc_id = '$PKG'\"; - \"\$MODDIR/bin/sqlite3\" \"/data/user/\$user_id/\$PS/databases/localappstate.db\" \"UPDATE appstate SET auto_update = '2' WHERE package_name = '$PKG'\"; - rm -rf \"/data/user/\$user_id/\$PS/cache/\"* - pm enable --user \"\$user_id\" \"\$PS\" -done">>"$modules_path/service.sh" - chmod -R 755 "$File_Dir/lib/$abi" - chmod -R 755 "$modules_path/bin" - mv "$File_Dir/lib/$abi" "$File_Dir/lib/$ARCH" - echo "id=$model -name=$model的破解版本 替代Vanced -version="V$(appinfo -o vn -f "$modules_path/$apkname")" -versionCode="$(appinfo -o vc -f "$modules_path/$apkname")" -author=selfmuser,落葉淒涼(修改啟動腳本與優化刷入過程) -description=$model Revanced Extended Installer">"$modules_path/module.prop" - #rm -rf "$REPLY" - echoRgb "安裝完成" "2" - fi - done - [[ $(ls -t "$MODDIR"/*.zip &>/dev/bull) = "" ]] && echoRgb "未發現任何YT模塊,請放到本腳本目錄後重新嘗試" "0" -} backup_path() { if [[ $Output_path != "" ]]; then [[ ${Output_path: -1} = / ]] && Output_path="${Output_path%?}" @@ -263,7 +194,7 @@ backup_path() { fi PU="$(ls /dev/block/vold 2>/dev/null | grep -w 'public')" if [[ $PU != "" ]]; then - [[ -f /proc/mounts ]] && PT="$(cat /proc/mounts | grep -w "$PU" | awk '{print $2}')" + [[ -f /proc/mounts ]] && PT="$(cat /proc/mounts 2>/dev/null | grep -w "$PU" | awk '{print $2}')" if [[ -d $PT ]]; then if [[ $(echo "$MODDIR" | egrep -o "^${PT}") != "" || $USBdefault = true ]]; then hx="true" @@ -385,12 +316,12 @@ Backup_apk() { if [[ $apk_version = "" ]]; then echo "apk_version=\"$apk_version2\"" >>"$app_details" else - echo "$(cat "$app_details" | sed "s/${apk_version}/${apk_version2}/g")">"$app_details" + echo "$(cat "$app_details" &>/dev/null | sed "s/${apk_version}/${apk_version2}/g")">"$app_details" fi if [[ $versionName = "" ]]; then echo "versionName=\"$apk_version3\"" >>"$app_details" else - echo "$(cat "$app_details" | sed "s/${versionName}/${apk_version3}/g")">"$app_details" + echo "$(cat "$app_details" &>/dev/null | sed "s/${versionName}/${apk_version3}/g")">"$app_details" fi [[ $PackageName = "" ]] && echo "PackageName=\"$name2\"" >>"$app_details" [[ $ChineseName = "" ]] && echo "ChineseName=\"$name1\"" >>"$app_details" @@ -427,7 +358,7 @@ Backup_data() { data) Size="$dataSize" ;; obb) Size="$obbSize" ;; *) - [[ -f $app_details ]] && Size="$(cat "$app_details" | awk "/$1Size/"'{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g')" + [[ -f $app_details ]] && Size="$(cat "$app_details" &>/dev/null | awk "/$1Size/"'{print $1}' | cut -f2 -d '=' | tail -n1 | sed 's/\"//g')" data_path="$2" if [[ $1 != storage-isolation && $1 != thanox ]]; then Compression_method1="$Compression_method" @@ -469,13 +400,13 @@ Backup_data() { if [[ $zsize != "" ]]; then rm -rf "$2/PATH" if [[ $Size != "" ]]; then - echo "$(cat "$app_details" | sed "s/$Size/$(du -ks "$data_path" | awk '{print $1}')/g")">"$app_details" + echo "$(cat "$app_details" &>/dev/null | sed "s/$Size/$(du -ks "$data_path" | awk '{print $1}')/g")">"$app_details" else echo "#$1Size=\"$(du -ks "$data_path" | awk '{print $1}')\"" >>"$app_details" fi else if [[ $Size != "" ]]; then - echo "$(cat "$app_details" | sed "s/$Size/$(du -ks "$data_path" | awk '{print $1}')/g")">"$app_details" + echo "$(cat "$app_details" &>/dev/null | sed "s/$Size/$(du -ks "$data_path" | awk '{print $1}')/g")">"$app_details" else echo "$1Size=\"$(du -ks "$data_path" | awk '{print $1}')\"" >>"$app_details" fi @@ -756,6 +687,7 @@ backup) #效驗選填是否正確 isBoolean "$Lo" "Lo" && Lo="$nsx" if [[ $Lo = false ]]; then + isBoolean "$default_behavior" "default_behavior" && default_behavior="$nsx" isBoolean "$delete_folder" "delete_folder" && delete_folder="$nsx" isBoolean "$USBdefault" "USBdefault" && USBdefault="$nsx" isBoolean "$Backup_obb_data" "Backup_obb_data" && Backup_obb_data="$nsx" @@ -764,6 +696,8 @@ backup) else echoRgb "檢查目錄是否存在已卸載應用?\n -音量上檢查,下不檢查" get_version "檢查" "不檢查" && delete_folder="$branch" + echoRgb "檢查到已卸載應用\n -音量上刪除資料夾,下移動到其他處" + get_version "刪除" "移動到其他處" && default_behavior="$branch" echoRgb "存在usb隨身碟是否默認使用隨身碟?\n -音量上默認,下進行詢問" get_version "默認" "詢問" && USBdefault="$branch" echoRgb "是否備份外部數據 即比如原神的數據包\n -音量上備份,音量下不備份" "2" @@ -784,12 +718,10 @@ backup) echoRgb "壓縮方式:$Compression_method" echoRgb "提示 腳本支持後台壓縮 可以直接離開腳本\n -或是關閉終端也能備份 如需終止腳本\n -請執行終止腳本.sh即可停止\n -備份結束將發送toast提示語" "3" backup_path - echoRgb "配置詳細:\n -音量鍵確認:$Lo\n -Toast:$toast_info\n -更新:$update\n -已卸載應用檢查:$delete_folder\n -默認使用usb:$USBdefault\n -備份外部數據:$Backup_obb_data\n -備份user數據:$Backup_user_data\n -自定義目錄備份:$backup_media" + echoRgb "配置詳細:\n -音量鍵確認:$Lo\n -Toast:$toast_info\n -更新:$update\n -已卸載應用檢查:$delete_folder\n -卸載應用默認操作(true刪除false移動):$default_behavior\n -默認使用usb:$USBdefault\n -備份外部數據:$Backup_obb_data\n -備份user數據:$Backup_user_data\n -自定義目錄備份:$backup_media" D="1" C="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" if [[ $delete_folder = true ]]; then - echoRgb "假設檢查到已卸載應用時操作?\n -音量上刪除資料夾,下移動到其他處" - get_version "刪除" "移動到其他處" && operate="$branch" if [[ -d $Backup ]]; then if [[ $1 = "" ]]; then find "$Backup" -maxdepth 1 -type d 2>/dev/null | sort | while read; do @@ -797,7 +729,7 @@ backup) unset PackageName . "$REPLY/app_details" &>/dev/null if [[ $PackageName != "" && $(pm path --user "$user" "$PackageName" 2>/dev/null | cut -f2 -d ':') = "" ]]; then - if [[ $operate = true ]]; then + if [[ $default_behavior = true ]]; then rm -rf "$REPLY" echoRgb "${REPLY##*/}不存在系統 刪除資料夾" "0" else @@ -853,9 +785,8 @@ backup) [[ ! -f $Backup/重新生成應用列表.sh ]] && cp -r "$script_path/Get_DirName" "$Backup/重新生成應用列表.sh" [[ ! -f $Backup/轉換資料夾名稱.sh ]] && cp -r "$script_path/convert" "$Backup/轉換資料夾名稱.sh" [[ ! -f $Backup/壓縮檔完整性檢查.sh ]] && cp -r "$script_path/check_file" "$Backup/壓縮檔完整性檢查.sh" - [[ ! -f $Backup/安裝YT或是YTmusic.sh ]] && cp -r "$MODDIR/安裝YT或是YTmusic.sh" "$Backup/安裝YT或是YTmusic.sh" [[ -d $Backup/Media ]] && cp -r "$script_path/restore3" "$Backup/恢復自定義資料夾.sh" - [[ ! -f $Backup/backup_settings.conf ]] && echo "#1開啟0關閉\n\n#是否在每次執行恢復腳本時使用音量鍵詢問如下需求\n#如果是那下面兩項項設置就被忽略,改為音量鍵選擇\nLo=$Lo\n\n#備份與恢復遭遇異常或是結束後發送通知(toast與狀態欄提示)\ntoast_info=$toast_info\n\n#使用者\nuser=\n\n#腳本檢測更新後進行更新?\nupdate=$update\n\n#檢測到更新後的行為(1跳轉瀏覽器 0不跳轉瀏覽器,但是複製連結到剪裁版)\nupdate_behavior=$update_behavior\n#主色\nrgb_a=$rgb_a\n#輔色\nrgb_b=$rgb_b\nrgb_c=$rgb_c">"$Backup/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/backup_settings.conf" + [[ ! -f $Backup/backup_settings.conf ]] && echo "#1開啟0關閉\n\n#是否在每次執行恢復腳本時使用音量鍵詢問如下需求\n#如果是那下面兩項項設置就被忽略,改為音量鍵選擇\nLo=$Lo\n\n#備份與恢復遭遇異常或是結束後發送通知(toast與狀態欄提示)\ntoast_info=$toast_info\n\n#使用者\nuser=\n\n#腳本檢測更新後進行更新?\nupdate=$update\n\n#檢測到更新後的行為(1跳轉瀏覽器 0不跳轉瀏覽器,但是複製連結到剪裁版)\nupdate_behavior=$update_behavior\n\n#恢復模式(1僅恢復未安裝應用0全恢復)\nrecovery_mode=0\n\n#主色\nrgb_a=$rgb_a\n#輔色\nrgb_b=$rgb_b\nrgb_c=$rgb_c">"$Backup/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/backup_settings.conf" filesha256="$(sha256sum "$bin_path/tools.sh" | cut -d" " -f1)" filesha256_1="$(sha256sum "$Backup/tools/bin/tools.sh" | cut -d" " -f1)" [[ $filesha256 != $filesha256_1 ]] && cp -r "$bin_path/tools.sh" "$Backup/tools/bin/tools.sh" @@ -1046,6 +977,35 @@ Restore) sort -u "$txt" -o "$txt" 2>/dev/null r="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" [[ $r = "" ]] && echoRgb "appList.txt包名為空或是被注釋了\n -請執行\"重新生成應用列表.sh\"獲取應用列表再來恢復" "0" && exit 1 + #效驗選填是否正確 + isBoolean "$Lo" "Lo" && Lo="$nsx" + if [[ $Lo = false ]]; then + isBoolean "$recovery_mode" "recovery_mode" && recovery_mode="$nsx" + else + echoRgb "選擇應用恢復模式\n -音量上僅恢復未安裝,下全恢復" + get_version "恢復未安裝" "全恢復" && recovery_mode="$branch" + fi + if [[ $recovery_mode = true ]]; then + echoRgb "獲取未安裝應用中" + TXT="$MODDIR/TEMP.txt" + while [[ $i -le $r ]]; do + name1="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $1}')" + name2="$(cat "$txt" | grep -v "#" | sed -e '/^$/d' | sed -n "${i}p" | awk '{print $2}')" + if [[ $(pm list packages --user "$user" "$name2" 2>/dev/null | cut -f2 -d ':') = "" ]]; then + echo "$name1 $name2">>"$TXT" + fi + let i++ + done + i=1 + sort -u "$TXT" -o "$TXT" 2>/dev/null + r="$(cat "$TXT" 2>/dev/null | grep -v "#" | sed -e '/^$/d' | sed -n '$=')" + if [[ $r != "" ]]; then + echoRgb "獲取完成 預計安裝$r個應用" + txt="$TXT" + else + echoRgb "獲取完成 但備份內應用都已安裝....正在退出腳本" "0" && exit 0 + fi + fi [[ $(which restorecon) = "" ]] && echoRgb "restorecon命令不存在" "0" && exit 1 #開始循環$txt內的資料進行恢複 #記錄開始時間 @@ -1121,7 +1081,7 @@ Restore) fi let i++ en++ nskg++ done - rm -rf "$TMPDIR/scriptTMP" + rm -rf "$TMPDIR/scriptTMP" "$TXT" starttime1="$TIME" echoRgb "批量恢複完成" && endtime 1 "批量恢複開始到結束" && echoRgb "如發現應用閃退請重新開機" longToast "批量恢復完成" @@ -1314,7 +1274,6 @@ backup_media) [[ ! -f $Backup/重新生成應用列表.sh ]] && cp -r "$script_path/Get_DirName" "$Backup/重新生成應用列表.sh" [[ ! -f $Backup/轉換資料夾名稱.sh ]] && cp -r "$script_path/convert" "$Backup/轉換資料夾名稱.sh" [[ ! -f $Backup/壓縮檔完整性檢查.sh ]] && cp -r "$script_path/check_file" "$Backup/壓縮檔完整性檢查.sh" - [[ ! -f $Backup/安裝YT或是YTmusic.sh ]] && cp -r "$MODDIR/安裝YT或是YTmusic.sh" "$Backup/安裝YT或是YTmusic.sh" [[ ! -d $Backup/tools ]] && cp -r "$tools_path" "$Backup" && rm -rf "$Backup/tools/bin/zip" "$Backup/tools/script" [[ ! -f $Backup/backup_settings.conf ]] && echo "#1開啟0關閉\n\n#是否在每次執行恢復腳本時使用音量鍵詢問如下需求\n#如果是那下面兩項項設置就被忽略,改為音量鍵選擇\nLo=$Lo\n\n#備份與恢復遭遇異常或是結束後發送通知(toast與狀態欄提示)\ntoast_info=$toast_info\n\n#腳本檢測更新後進行更新?\nupdate=$update\n\n#檢測到更新後的行為(1跳轉瀏覽器 0不跳轉瀏覽器,但是複製連結到剪裁版)\nupdate_behavior=$update_behavior">"$Backup/backup_settings.conf" && echo "$(sed 's/true/1/g ; s/false/0/g' "$Backup/backup_settings.conf")">"$Backup/backup_settings.conf" app_details="$Backup_folder/app_details" @@ -1339,7 +1298,4 @@ backup_media) echoRgb "自定義路徑為空 無法備份" "0" fi ;; -YT) - install_YT - ;; esac \ No newline at end of file diff --git a/tools/script/Get_DirName b/tools/script/Get_DirName index 985b096..56f81f1 100644 --- a/tools/script/Get_DirName +++ b/tools/script/Get_DirName @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="dumpname" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file diff --git a/tools/script/check_file b/tools/script/check_file index 530d402..2ba3a74 100644 --- a/tools/script/check_file +++ b/tools/script/check_file @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="check_file" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file diff --git a/tools/script/convert b/tools/script/convert index 9d240a4..9dfa540 100644 --- a/tools/script/convert +++ b/tools/script/convert @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="convert" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file diff --git a/tools/script/restore b/tools/script/restore index d1b11ac..9b50e87 100644 --- a/tools/script/restore +++ b/tools/script/restore @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="Restore" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file diff --git a/tools/script/restore2 b/tools/script/restore2 index 16e5ddb..e7f98ea 100644 --- a/tools/script/restore2 +++ b/tools/script/restore2 @@ -2,7 +2,7 @@ if [ -f "${0%/*/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="Restore2" conf_path="${0%/*/*}/backup_settings.conf" - . "${0%/*/*}/tools/bin/tools.sh" + . "${0%/*/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file diff --git a/tools/script/restore3 b/tools/script/restore3 index 86ba7c4..55e0cfd 100644 --- a/tools/script/restore3 +++ b/tools/script/restore3 @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="Restore3" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遺失" fi \ No newline at end of file diff --git a/備份應用.sh b/備份應用.sh index d0b9ee9..777ab70 100644 --- a/備份應用.sh +++ b/備份應用.sh @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="backup" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遗失" fi \ No newline at end of file diff --git a/備份自定義資料夾.sh b/備份自定義資料夾.sh index a3cd53a..5cdcefc 100644 --- a/備份自定義資料夾.sh +++ b/備份自定義資料夾.sh @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="backup_media" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遗失" fi \ No newline at end of file diff --git a/安裝YT或是YTmusic.sh b/安裝YT或是YTmusic.sh deleted file mode 100644 index 5a788bb..0000000 --- a/安裝YT或是YTmusic.sh +++ /dev/null @@ -1,7 +0,0 @@ -if [ -f "${0%/*}/tools/bin/tools.sh" ]; then - MODDIR="${0%/*}" - operate="YT" - . "${0%/*}/tools/bin/tools.sh" -else - echo "${0%/*}/tools/bin/tools.sh遗失" -fi \ No newline at end of file diff --git a/生成應用列表.sh b/生成應用列表.sh index 5070157..c8b5ae5 100644 --- a/生成應用列表.sh +++ b/生成應用列表.sh @@ -1,7 +1,7 @@ if [ -f "${0%/*}/tools/bin/tools.sh" ]; then MODDIR="${0%/*}" operate="Getlist" - . "${0%/*}/tools/bin/tools.sh" + . "${0%/*}/tools/bin/tools.sh" | tee "$MODDIR/log.txt" else echo "${0%/*}/tools/bin/tools.sh遗失" fi \ No newline at end of file diff --git a/終止腳本.sh b/終止腳本.sh index 0182b15..20462eb 100644 --- a/終止腳本.sh +++ b/終止腳本.sh @@ -3,14 +3,8 @@ if [ -f "${0%/*}/tools/bin/bin.sh" ]; then bin_path="$MODDIR/tools/bin" [[ $(find "$MODDIR" -maxdepth 1 -name "*.zip" -type f 2>/dev/null) ]] && echo "警告!此腳本不能拿來更新腳本" && exit 2 . "$MODDIR/tools/bin/bin.sh" - touch "$TMPDIR/STOP_script" echoRgb "等待腳本停止中,請稍後....." - { - while [[ -f $TMPDIR/STOP_script ]]; do - sleep 1 - done - } & - wait && echoRgb "已經停止" "1" + kill_Serve && echoRgb "腳本終止" exit else echo "$MODDIR/tools/bin/bin.sh遗失"