如何用find实现删除指定目录下的非目录1...9的其他目录?

sh/bash/dash/ksh/zsh等Shell脚本
回复
carbonjiao
帖子: 78
注册时间: 2006-12-03 10:43
送出感谢: 0
接收感谢: 0

如何用find实现删除指定目录下的非目录1...9的其他目录?

#1

帖子 carbonjiao » 2009-02-10 16:45

俺想将 /usr/share/locale下的除zh_CN外的文件夹删除,locale.alias和zh_CN目录内的东西不能删除
将/usr/share/man下的除中文、英文外的帮助文件删除。。。

$ find /usr/share/locale -maxdepth 0 \( -type d ! -name "zh_CN" \) -exec ls {} \;
am cs de_AT el et fr hu ja lt nl pt_BR si tr vi
ar da de_CH en_GB eu gl id ko lv no pt_PT sk uk zh_CN
ca de de_DE es fi he it locale.alias nb_NO pl ru sv ur zh_TW

结果错误,zh_CN被列出来了

$ ls /usr/share/man
es jp man0p man1p man3 man3x man5 man7 mann sv
fr man man1 man2 man3p man4 man6 man8 nl zh_CN

$ find /usr/share/man -maxdepth 0 \( -type d ! -name "man*" -name "zh_CN" \) -exec ls {} \;
$ find /usr/share/man -maxdepth 1 \( -type d ! -name "man*" ! -name "zh_CN" \) -exec ls {} \;
man1
man1
man1
man1
man1
$ find /usr/share/man -maxdepth 0 \( -type d ! -name "man*" ! -name "zh_CN" \) -exec ls {} \;
也错误。。。。

同时俺想将这个功能——删除指定目录下 除。。。以外的所有目录
rm-dir-except ()
{
#$0, 需要清理的目标目录;
#$1, ... 需要排除的目录;
find $0 -maxdepth 0 .....

}

以下是俺最开始实现的脚本,但俺认为功能强大的find应该可以完成这个简单动作——删除/usr/share/locale下非zh_CN的目录, zh_CN的下级目录自然是不能删除的。。。

#!/bin/bash
ls /usr/share/locale >>/tmp/del.txt
cat "/tmp/del.txt"| grep -v "^#" | while read dirname; do
if [ "$dirname" != "zh_CN" ] && [ "$dirname" != "locale.alias" ]; then
echo " 删除语言包$dirname"
rm -rf "/usr/share/locale/$dirname"
else
echo " 保留语言包$dirname"
echo "/usr/share/locale/$dirname"
fi
done

但这个基本也不具备通用性——删除指定目录下除指定的目录外的目录。。。
比如要实现删除/usr/share/man下除zh_CN和英文帮助外的所有帮助文件,代码就很麻烦的了。。。


哪位高手兄弟能帮忙下? 多谢了
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#2

帖子 eexpress » 2009-02-10 23:27

() 加什么啊,参数一串过去就是。
直接-iregex啊。
正则表达式啊。
● 鸣学
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58
送出感谢: 0
接收感谢: 1 次

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#3

帖子 gududehuo » 2009-02-11 13:53

find /usr/share/locale -maxdepth 0 \( -type d ! -name "zh_CN" \) -exec ls {} \;
find 到/usr/share/locale这个文件夹,由于设置了maxdepth 0。所有只对/usr/share/locale这个文件夹操作exec后面的ls,那当然是列出全部内容了,当然也包括zh_CN。
find /usr/share/locale/* -maxdepth 0 -type d ! -iregex ".*zh.CN" -exec echo {} \;
这样就可以列出 /usr/share/locale/ 下不包含zh_CN的所有文件夹了。
新人见解,请验证后在进行操作。 :em05
carbonjiao
帖子: 78
注册时间: 2006-12-03 10:43
送出感谢: 0
接收感谢: 0

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#4

帖子 carbonjiao » 2009-02-11 14:32

楼上的解决方案ok! 多谢!
$ find /usr/share/locale/* -maxdepth 0 -type d ! -iregex ".*zh.CN" -exec echo {} \;
/usr/share/locale/ar
/usr/share/locale/ca
/usr/share/locale/cs
/usr/share/locale/da
/usr/share/locale/de
/usr/share/locale/de_AT
/usr/share/locale/de_CH
/usr/share/locale/de_DE
/usr/share/locale/el
/usr/share/locale/en_GB
/usr/share/locale/es
/usr/share/locale/et
/usr/share/locale/eu
/usr/share/locale/fi
/usr/share/locale/fr
/usr/share/locale/gl
/usr/share/locale/he
/usr/share/locale/hu
/usr/share/locale/it
/usr/share/locale/ja
/usr/share/locale/ko
/usr/share/locale/lt
/usr/share/locale/lv
/usr/share/locale/nb_NO
/usr/share/locale/nl
/usr/share/locale/no
/usr/share/locale/pl
/usr/share/locale/pt_BR
/usr/share/locale/pt_PT
/usr/share/locale/ru
/usr/share/locale/sk
/usr/share/locale/sv
/usr/share/locale/tr
/usr/share/locale/ur
/usr/share/locale/vi
/usr/share/locale/zh_TW
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58
送出感谢: 0
接收感谢: 1 次

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#5

帖子 gududehuo » 2009-02-11 14:45

发个东东,自己研究下,应该可以达到你的要求
#!/bin/bash
echo "哪个文件夹下的内容你想要删除"
read deldir
[ ! -d $deldir ] && 不存在你指定的文件夹 && exit
#deldir=`echo "$deldir" | sed 's/\/$//'`

echo "哪些文件你想要保留,请输入名称,名称之间用空格隔开"
read keepfile
keepfile=(`echo $keepfile`)

find "$deldir" -maxdepth 1 | while read line ; do
case $line in
$deldir) :;;
*) test=`basename $line` && for test2 in ${keepfile[@]} ; do
[ "$test" == "$test2" ] && break ; done || echo $line;; ##echo $line把这里改成你想要的命令
esac
done
:em05 :em05 :em05
上次由 gududehuo 在 2009-02-11 14:50,总共编辑 1 次。
gududehuo
帖子: 92
注册时间: 2008-05-25 22:58
送出感谢: 0
接收感谢: 1 次

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#6

帖子 gududehuo » 2009-02-11 14:48

还有问下ee,find 下! -name 也可以排除指定的一个文件名,但如果是多个该怎么写? :em04 :em04
carbonjiao
帖子: 78
注册时间: 2006-12-03 10:43
送出感谢: 0
接收感谢: 0

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#7

帖子 carbonjiao » 2009-02-11 16:45

gududehuo 写了:发个东东,自己研究下,应该可以达到你的要求
#!/bin/bash
echo "哪个文件夹下的内容你想要删除"
read deldir
[ ! -d $deldir ] && 不存在你指定的文件夹 && exit
#deldir=`echo "$deldir" | sed 's/\/$//'`

echo "哪些文件你想要保留,请输入名称,名称之间用空格隔开"
read keepfile
keepfile=(`echo $keepfile`)

find "$deldir" -maxdepth 1 | while read line ; do
case $line in
$deldir) :;;
*) test=`basename $line` && for test2 in ${keepfile[@]} ; do
[ "$test" == "$test2" ] && break ; done || echo $line;; ##echo $line把这里改成你想要的命令
esac
done
:em05 :em05 :em05

多谢!
有用,俺会将其转化为函数,在shell中引用。。。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#8

帖子 aerofox » 2009-02-11 22:22

太长了,没太看清楚具体要求。
不过在 find 后加 -exec echo {} \; 实在是有点舍近求远,一个 -print 或者干脆什么也没有就实现相同的功能。
头像
JustinLei
帖子: 85
注册时间: 2005-09-20 14:29
来自: 弯弯的月亮
送出感谢: 0
接收感谢: 0

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#9

帖子 JustinLei » 2009-02-16 16:32

没搞明白,这样不行么?

代码: 全选

ls -a | egrep -v [*zh.CN*] | xargs rm -Rvf
难道是我理解错你的需求了..呵呵
头像
charleskao
帖子: 206
注册时间: 2008-03-27 17:21
送出感谢: 0
接收感谢: 0
联系:

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#10

帖子 charleskao » 2009-03-05 15:08

rm -dir -f dirname
头像
liangwilliam
帖子: 36
注册时间: 2008-07-27 11:16
来自: 廣州
送出感谢: 1 次
接收感谢: 0

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#11

帖子 liangwilliam » 2010-06-18 3:12

做个记号~
tusooa
帖子: 6546
注册时间: 2008-10-31 22:12
系统: 践兔
送出感谢: 6 次
接收感谢: 10 次
联系:

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#12

帖子 tusooa » 2010-07-01 21:07

用find 干吗,自讨苦吃阿。

代码: 全选

for dir in /path/to/your/dir/* ; do
    [ "$dir" = "要排除的目录" ] || rm -ri "$dir"
done
不就行了。

代码: 全选

] ls -ld //
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?

#13

帖子 BigSnake.NET » 2010-07-01 21:10

这些事情
建议在 rm 前面加个 echo , 确认无误再执行
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
回复

回到 “Shell脚本”