LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1300|回复: 3

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

[复制链接]
发表于 2009-2-10 17:17:15 | 显示全部楼层 |阅读模式
俺想将 /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和英文帮助外的所有帮助文件,代码就很麻烦的了。。。


哪位高手兄弟能帮忙下? 多谢了
发表于 2009-2-11 00:36:21 | 显示全部楼层
find /usr/share/locale -maxdepth 1 -not -name zh\* -and -not -name local.alias  -exec ls -ld {} \;
去掉exec你其实可以看到正确结果
ls如果不加-d参数,会显示子目录的内容.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-11 12:14:49 | 显示全部楼层
rm 对应什么参数呢?

俺如此执行,结果/usr/share/locale/下被删空了!

[12:04:09][arch@archlive:/usr/share/locale]$ ls
am  cs     de_CH  es  fr  id  locale.alias  nl     pt_PT  sv  ur
ar  da     de_DE  et  gl  it  lt            no     ru     sw  vi
bn  de     el     eu  he  ja  lv            pl     si     tr  zh_CN
ca  de_AT  en_GB  fi  hu  ko  nb_NO         pt_BR  sk     uk  zh_TW
[12:04:10][arch@archlive:/usr/share/locale]$ sudo find /usr/share/locale -maxdepth 1 -not -name zh\* -and -not -name locale.alias -exec rm -rf {} \;
find: `/usr/share/locale': No such file or directory
[12:05:10][arch@archlive:/usr/share/locale]$ ls
[12:05:26][arch@archlive:/usr/share/locale]$ ls
[12:05:29][arch@archlive:/usr/share/locale]$
回复 支持 反对

使用道具 举报

发表于 2009-2-11 15:28:23 | 显示全部楼层
不好意思, 呵呵. 上面写的那个命令把"."匹配进去了.即本级子目录.
另外你执行这样的命令之前都不测试一下的啊?

bash@calabash:~/temp$ ls
de  en  jp  locale.alias  us  zh  zh_CN  zh_CN.UTF-8
bash@calabash:~/temp$ find . -maxdepth 1 -not -name zh\* -and -not -name '\.' -and -not -name 'locale.alias' -exec rm -rf {} +
bash@calabash:~/temp$ ls
locale.alias  zh  zh_CN  zh_CN.UTF-8
bash@calabash:~/temp$
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表