如何删除除具有特定模式或特定类型的文件以外的所有文件?

时间:2015-05-25 10:46:49

标签: bash shell unix cron find

我有一个脚本(通过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

2 个答案:

答案 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