关于删除多余文件问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

关于删除多余文件问题

#1

帖子 sharp_minminzhu » 2010-05-26 10:41

:em01
从网上下载了很多桌面壁纸,但是有些是重复的,只是分辨率不同而已,其中这种差异已反应到文件名上,如:
abc_800x600.jpg
abc_1024x768.jpg
ccc_800x600.jpg
ccc_1024x768.jpg
ccc_1280x768.jpg

我想只保留一份文件,将多余分辨率的图片全部删除,试问有没有简单的命令可以处理?如果非要写脚本的话又怎么写呢?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 关于删除多余文件问题

#2

帖子 eexpress » 2010-05-26 11:23

geeqie
● 鸣学
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#3

帖子 sharp_minminzhu » 2010-05-26 11:32

是删除,不是修改。
同时分辨率大小的是不固定的,不是每张图片都有1024*768大小的。
如果用脚本的话,恐怕要双重循环。
hrbeu06ws
帖子: 100
注册时间: 2008-09-25 16:06

Re: 关于删除多余文件问题

#4

帖子 hrbeu06ws » 2010-05-26 15:06

代码: 全选

find path ! -name '*1024x768.jpg' -exec rm -f {} \;
path为指定的查找路径
Power cloaked in simplicity !
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#5

帖子 sharp_minminzhu » 2010-05-26 15:26

都说不是全都有1024*768大小的咯,比如:
abc_1024*768.jpg
abc_1280*768.jpg
ddd_800*600.jpg
eee_1440*900.jpg
ffa_800*600.jpg
ffa_1280*700.jpg
....
...
....
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#6

帖子 sharp_minminzhu » 2010-05-26 15:30

代码: 全选

#!/bin/bash
#program: remove duplicate pictures which have excess display rate.
#version: 1.0
#by DD++ 2010-5-24

read -p "Please input the picture directory,like this \"/home/usr/picture\": " dir
while [ -z "$dir" ] || [ ! -d "$dir" ]
do
	echo "The $dir is NOT exist in Linux system!"
	read -p "Please try again: " dir
done

filelist=$(ls $dir)
while [ -n "$filelist" ]
do
	declare -i count=1	
	filename=$(echo $filelist | cut -d " " -f 1)
	filelist2=$(echo $filelist | cut -d " " -f 2-)
	[ "$filelist" == "$filelist2" ] && break	#如果文件列表只有一个时,不管cut -f 后取什么都会返回这个文件,所以必须加这句
	for filename2 in $filelist2
	do
		if [ $(echo $filename | cut -d "_" -f 1) == $(echo $filename2 | cut -d "_" -f 1) ]; then
			rm -v "$dir/$filename2"
			count=$(($count+1))
		else
			filelist=$(echo $filelist2 | cut -d " " -f ${count}-)
			break 	
		fi	
	done	
done

echo "Well done, goodbye!"
这是我写的程序,用双重循环做的,但总觉得效率好低,也难看,不知还有什么好方法?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 关于删除多余文件问题

#7

帖子 eexpress » 2010-05-26 15:33

这么傻。说了软件,你不用。
:em04
● 鸣学
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#8

帖子 sharp_minminzhu » 2010-05-26 15:36

用软件就显得聪明了吗?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 关于删除多余文件问题

#9

帖子 eexpress » 2010-05-26 15:37

因为你不明白图片的比较,是个什么事情。
所以,反正你没显得出。
● 鸣学
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#10

帖子 sharp_minminzhu » 2010-05-26 15:40

那好吧,我非要代码,不要软件总行了吧
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 关于删除多余文件问题

#11

帖子 eexpress » 2010-05-26 15:44

你咋就不愿意试试先呢。
那么多种比较,找重复的。
:em04
● 鸣学
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 关于删除多余文件问题

#12

帖子 aerofox » 2010-05-29 23:45

不需要双重循环。
循环一次应该可以搞定,思路是这样:把 abc_800x600.jpg 这样的文件名改为 abc.jpg,在改名时如果已经存在 abc.jpg,就用你的条件判断一下是保留原来的 abc.jpg,还是覆盖,如果保留,就把正在处理的 abc_800x600.jpg 这样的文件删除。
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#13

帖子 sharp_minminzhu » 2010-05-31 22:42

:em11 :em11 楼上的好主意,不知哪个效率会更高点,哈哈
sharp_minminzhu
帖子: 67
注册时间: 2009-11-12 20:27

Re: 关于删除多余文件问题

#14

帖子 sharp_minminzhu » 2010-06-01 9:33

代码: 全选

#!/bin/bash
#program: remove duplicate pictures which have excess display rate.
#version: 3.0
#by DD++ 2010-5-31

dir=${1:-$PWD}
#dir=${dir%/}		#没必要去掉尾部的/,shell自动处理
[ ${dir:0:1} != "/" ] && dir="$PWD/$dir"
if [ ! -d "$dir" ]; then
	echo "The $dir is NOT exist in Linux system!"
	exit 0
fi

read -p "Do you want to backup the duplicate pictures?(y/n) " bkflag
if [ "$bkflag" == 'y' -o "$bkflag" == 'Y' ] && [ ! -d "${HOME}/picbk" ]; then
	mkdir ~/picbk
fi

filelist=$(ls $dir)
for filename in $filelist
do
	filenamebase=${filename%_*}\.${filename##*.}
	if [ ! -e $dir/$filenamebase ]; then
		mv -v $dir/$filename $dir/$filenamebase
	else
		[ "$bkflag" == 'y' -o "$bkflag" == 'Y' ] && mv -v $dir/$filename ~/picbk/ || rm -v $dir/$filename
	fi	
done

[ "$bkflag" == 'y' -o "$bkflag" == 'Y' ] && echo -e "Take easy, pictures has been backuped\nYou can find them in $HOME/picbk/"

exit 0
哈哈,效率相当高啊,一下子就完成了,双重循环慢的原因应该是太多管道和多次echo大量文件名。谢谢
wisefox
帖子: 4
注册时间: 2005-09-24 12:12

Re: 关于删除多余文件问题

#15

帖子 wisefox » 2010-06-04 13:46

代码: 全选

#!/bin/bash
PirFileNmShort=
for filename in `ls`; do
    CurFileNmShort=${filename%_*.jpg}     # match aaa_xxxx*yyyy.jpg
    test "$CurFileNmShort" = "$PirFileNmShort" && rm $filename
    PirFileNmShort=$CurFileNmShort
done
回复