我是shell脚本的新手。能否请您提供一些以下要求的代码?
我有以下格式化文件夹
示例:/home/backup/store_id/datewisefolder/some.zip
喜欢:/home/backup/44/22032014/some_file.zip
/home/backup/44/23032014/some_file.zip
/home/backup/44/24032014/some_file.zip
/home/backup/44/25032014/some_file.zip
更多..
我想去每家商店的id文件夹&只保留最近3个日期文件夹的其余部分。这里有44个商店id文件夹23032014,24032014,25032014这三个是最近的一个所以保持原样。 22032014年龄较大,请删除一个。
我编写了shell代码,找出最近的三个文件,但我不知道如何使用store_ID文件夹循环删除休息。
下面的代码找出最近的文件夹日期
cd / home / backup / 44 / ls -1 | sort -n -k1.8 -k1.4 -k 1 |尾巴-3
答案 0 :(得分:0)
下面的脚本可以工作。
declare -a axe
axe=`ls -l /home/backup/* | sort -n -k1.8 -k1.4 -k 1|head -n -3`
for i in $axe
do
rm -rf $i;
done
答案 1 :(得分:0)
find是执行此类任务的常用工具:
find ./my_dir -mtime +3 -delete
explaination:
./my_dir your directory (replace with your own)
-mtime +3 older than 3 days
-delete delete it.
或根据您的脚本代码
files=(`ls -1 /my_dir | sort -n -k1.8 -k1.4 -k 1 | tail -3`)
for i in *; do
keep=0;
#Check whether this file is in files array:
for a in ${files[@]}; do
if [ $i == $a ]; then
keep=1;
fi;
done;
# If it wasn't, delete it
if [ $keep == 0 ]; then
rm -rf $i;
fi;
done
答案 2 :(得分:0)
ls /home/backup | while read store_id
do
count=0
ls -t /home/backup/$store_id | while read dir_to_remove
do
count=$((count + 1))
if [ $count -gt 3 ]; then
rm -rf /home/backup/$store_id/$dir_to_remove
fi
done
done
答案 3 :(得分:0)
依次cd进每个store_id目录。创建一个目录列表,其中包含以相反顺序排序的八位数名称(最近一次);最后传递列表的一部分,省略第一个$ retain元素到rm。
basedir=/home/backup
# How many directories to keep:
retain=3
shopt -s nullglob
# Assuming that anything beginning with a digit is a store_id directory.
for workdir in "$basedir"/[0-9]*/ ; do
(
cd "$workdir" || exit 1
# Create the list. The nullglob option ensures that if there are no
# suitable directories, rmlist will be empty.
rmlist=(
$(
printf '%s\n' [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ |
sort -nr -k1.5,1.8 -k1.3,1.4 -k1.1,1.2
)
)
# If there are fewer than $retain entries in ${rmlist[@]}, rm will be
# given no names and so do nothing.
rm -rf -- "${rmlist[@]:$retain}"
)
done