我有一个脚本(通过cron定期执行),从他们的服务器下载最新版本的WhatsApp。我想在我的服务器中使用软链接TestProject
|
-src
-com.test.pkg
-MyTestClass.java
-test
+com.test.pkg
保留文件名为WhatsApp_x.x.xx
的最新版本。
latest.apk
这就是#!/bin/bash
# Get the local version
oldVer=$(ls -v1 | grep -v latest | tail -n 1 | awk -F "_" '{print $2}' | grep -oP ".*(?=.apk)")
# Get the server version
newVer=$(wget -q -O - "$@" whatsapp.com/android | grep -oP '(?<=Version )([\d.]+)')
# Check if the server version is newer
newestVer=$(echo -e "$oldVer\n$newVer" | sort -n | tail -n 1)
#Download the newer versino
[ "$newVer" = "$newestVer" ] && [ "$oldVer" != "$newVer" ] && wget -O WhatsApp_${newVer}_.apk http://www.whatsapp.com/android/current/WhatsApp.apk || echo "The newest version already downloaded"
#Delete all files that not is a new version
find ! -name "*$newVer*" ! -type d -exec rm -f {} \;
# set the link to the latest
ln -sf $(ls -v1 | grep -v latest| tail -n1) latest.apk
的样子:
/var/www/APK
但是这个命令:
/var/www/APK$ tree
.
├── latest.apk -> WhatsApp_2.12.96_.apk
├── script.sh
└── WhatsApp_2.12.96_.apk
它还删除了find ! -name "*$newVer*" ! -type d -exec rm -f {} \;
文件。如何修改语句以不影响其他文件?我无法想到任何事情。
这是cronjob,如果有帮助:
script.sh
答案 0 :(得分:1)
使用find,您可以将多个相同类型的条件链接在一起。这为您提供了几个选项:
您可以将其他特定文件列入黑名单,例如:
find ! -name "*$newVer*" ! -name 'script.sh' ! -type d -delete
或者只是将.apk
扩展名列入白名单:
find -name '*.apk' ! -name "*$newVer*" ! -type d -delete
答案 1 :(得分:0)
find /var/www/APK -type f -name '*.apk' -print |
sort -V |
tail -n +2 |
xargs echo rm
找到特定目录下的.apk
个文件,
按版本对它们进行排序(可能需要GNU排序),
从列表中删除除最新版本之外的所有版本,
并告诉你哪些将被删除。
如果您对找到合适的文件感到满意,请取出echo
采用不同的方法:我将假设所有APK文件都在同一目录中,并且文件名不包含空格。
#!/bin/bash
shopt -s extglob nullglob
cd /var/www/APK
apk_files=( printf "%s\n" !(latest).apk | sort -V )
newest=${apk_files[0]}
for (( i=1; i < ${#apk_files[@]}; i++ )); do
echo rm "${apk_files[i]}"
done
ln -f -s "$newest" latest.apk