​ 作为一个有收藏癖的lsp,特别喜欢收集各种美图和壁纸,可能一不小心就收集了上万张。虽然收集了很多壁纸,但是里面满足屏幕(比例和分辨率)要求的可能并不多。大量的图片带来的后果是我很难从中间选出心仪的壁纸,同时也不想删除好不容易收集来的图片。于是我写了一个shell脚本用来筛选满足要求的壁纸。

脚本主要实现以下目标:

支持最高\最低分辨力限制

支持宽高比限制

将所有文件用md5重命名,避免重复收集

话不多说直接放代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/bash
init() {
	# 图片最小宽度
	readonly min_width=1920
	# 图片最大宽度,0代表无限制
	readonly max_width=0
	# 图片最小高度
	readonly min_height=1080
	# 图片最大高度,0代表无限制
	readonly max_height=0
	# 宽高比的宽容度,即 (1-radio)*标准宽高比<高度/宽度<(1+radio)*标准宽高比
	readonly radio="0.15"
	# 宽高比的上界
	readonly upperbound="$min_width/$min_height*(1+$radio)"
	# 宽高比下界
	readonly lowerbound="$min_width/$min_height*(1-$radio)"
	# 垃圾目录名,不符合要求的图片会被移动到新建目录
	readonly trash_dir="trash"
	# 输出调试信息
	readonly debug=0
	# 创建垃圾目录
	mkdir -p $trash_dir
}

check_if_image_well() {
	width=$1
	height=$2
	if [ "$width" -lt $min_width ] || [ "$height" -lt $min_height ]; then
		# 不满足最低宽高限制
		`test "$width" -lt $min_width` && printD $width
		`test "$height" -lt $min_height` &&printD $height
		return 0
	elif [ "$max_width" -gt 0 -a "$width" -gt $max_width ] ||
		[ "$max_height" -gt 0 -a "$height" -gt $max_height ]; then
		# 不满足最高寬高限制
		`test "$max_width" -gt 0 -a "$width" -gt $max_width` && printD "$width"
		`test "$max_height" -gt 0 -a "$height" -gt $max_height` && printD "$height"
		return 0
	fi
	printD "start check radio"
	printD $width
	printD $height
	printD "$width/$height>=$lowerbound"
	printD "$width/$height<=$upperbound"
    if [ $(echo "scale=2;$width/$height>=$lowerbound" | bc) -eq 1 ] && [ $(scale=2;echo "$width/$height<=$upperbound" | bc) -eq 1 ]; then
    	# 满足所有限制
		return 1
	fi
	printD "$(echo "scale=2;$width/$height>=$lowerbound" | bc)"
	printD "$(echo "scale=2;$width/$height<=$upperbound" | bc)"
	return 0
}
printD(){
	# 打印调试信息
	if [ $debug == 1 ];then
		echo "$1"
	fi
}
	
main() {
	for file in $(ls *.{png,jepg,jpg} 2> /dev/null); do
		printD "=============$file==================="
		base=$(md5sum "$file" | awk '{print $1}')
		# echo $sum
		# echo -- "${file%%.*}" "${sum%% *}.${file##*.}"
		# rename -o --verbose -n ${file%%.*} $base $file
		# echo -- "${file%%.*}" "${sum%% *}.${file##*.}"
        out=$(magick identify -format "%[width] %[height]" "$file" 2> /dev/null)
        width=$(echo $out|awk '{print $1}')
        height=$(echo $out|awk '{print $2}')
        printD $width
        printD $height
		check_if_image_well "$width" "$height"
		ret=$?
		printD $ret
		if [ $ret -eq 1 ]; then
            printD "$file "$base.${file##*.}""
            #mv -n "$file" "" 
			mv -n "$file" "$base.${file##*.}"
			printD "$file yes"
		else
			mv $file "./$trash_dir"
			printD "$file no"
		fi
	done
	echo 'finished'
}

OLD_IFS=$IFS
IFS=$(echo -en "\n\b")

init
main

IFS=$OLD_IFS

使用方式:

默认分辨率为1920*1080,最高像素限制默认关闭,如有需要请修改init()内的内容

1
2
3
4
curl https://gist.github.com/wuliaotc/4ff108893777377b0d022d83195fc57d -o run.sh
mv run.sh "待筛选的图片目录"
chmod +x run.sh
./run.sh