当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 13 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-10 16:45 

注册: 2006-12-03 10:43
帖子: 78
送出感谢: 0 次
接收感谢: 0 次
俺想将 /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和英文帮助外的所有帮助文件,代码就很麻烦的了。。。


哪位高手兄弟能帮忙下? 多谢了


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-10 23:27 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
() 加什么啊,参数一串过去就是。
直接-iregex啊。
正则表达式啊。


_________________
● 鸣学


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-11 13:53 

注册: 2008-05-25 22:58
帖子: 92
送出感谢: 0 次
接收感谢: 1
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


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-11 14:32 

注册: 2006-12-03 10:43
帖子: 78
送出感谢: 0 次
接收感谢: 0 次
楼上的解决方案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


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-11 14:45 

注册: 2008-05-25 22:58
帖子: 92
送出感谢: 0 次
接收感谢: 1
发个东东,自己研究下,应该可以达到你的要求
引用:
#!/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 次

页首
 用户资料  
 
6 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-11 14:48 

注册: 2008-05-25 22:58
帖子: 92
送出感谢: 0 次
接收感谢: 1
还有问下ee,find 下! -name 也可以排除指定的一个文件名,但如果是多个该怎么写? :em04 :em04


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-11 16:45 

注册: 2006-12-03 10:43
帖子: 78
送出感谢: 0 次
接收感谢: 0 次
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中引用。。。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-11 22:22 

注册: 2008-05-24 8:30
帖子: 1453
送出感谢: 2
接收感谢: 30
太长了,没太看清楚具体要求。
不过在 find 后加 -exec echo {} \; 实在是有点舍近求远,一个 -print 或者干脆什么也没有就实现相同的功能。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-02-16 16:32 
头像

注册: 2005-09-20 14:29
帖子: 85
地址: 弯弯的月亮
送出感谢: 0 次
接收感谢: 0 次
没搞明白,这样不行么?
代码:
ls -a | egrep -v [*zh.CN*] | xargs rm -Rvf

难道是我理解错你的需求了..呵呵


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2009-03-05 15:08 
头像

注册: 2008-03-27 17:21
帖子: 206
送出感谢: 0 次
接收感谢: 0 次
rm -dir -f dirname


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2010-06-18 3:12 
头像

注册: 2008-07-27 11:16
帖子: 36
地址: 廣州
送出感谢: 1
接收感谢: 0 次
做个记号~


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2010-07-01 21:07 

注册: 2008-10-31 22:12
帖子: 6546
系统: 践兔
送出感谢: 18
接收感谢: 25
用find 干吗,自讨苦吃阿。
代码:
for dir in /path/to/your/dir/* ; do
    [ "$dir" = "要排除的目录" ] || rm -ri "$dir"
done

不就行了。


_________________
代码:
] ls -ld //


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 如何用find实现删除指定目录下的非目录1...9的其他目录?
帖子发表于 : 2010-07-01 21:10 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
这些事情
建议在 rm 前面加个 echo , 确认无误再执行


_________________
^_^ ~~~
要理解递归,首先要理解递归。

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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 13 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译