LinuxSir.cn,穿越时空的Linuxsir!

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

请问如果把目录和子目录名改成小写?

[复制链接]
发表于 2005-12-17 14:42:40 | 显示全部楼层 |阅读模式
我用find命令列出所有的目录,并在-exec中执行了mv命令,可是之后find会出错,第一层的目录已经变成了小写,可是find并不知道,使用原来的大写名字继续下一层搜索,结果找不到文件。
发表于 2005-12-17 17:21:21 | 显示全部楼层
find到所有目录后,把结果保存好,
然后从结果的后面往前修改......
回复 支持 反对

使用道具 举报

发表于 2005-12-17 17:28:24 | 显示全部楼层
试试这个方法

  1. find path >filelist
  2. sort -r filelist >filelist2
复制代码

然后写个循环读 filelist2 文件并改名

不知道 find 命令有没有选项使得结果以相反的顺序列出,找了一下没找到
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-18 18:38:48 | 显示全部楼层
唉!不知道有没有简便一点的办法,最后还是写了一个比较复杂的脚本来完成了:

  1. #!/bin/bash
  2. # 把一个目录下的所有文件名从大写改到小写
  3. if [ $# -lt 1 ]; then
  4.     echo "Usage: $0 dirname"
  5.     exit 1
  6. fi

  7. function process_file
  8. {
  9.     local file_name
  10.     if [ -d $1 ]; then
  11.         cd $1
  12.         for subfile in $(ls); do
  13.             process_file $subfile
  14.             done
  15.         cd ..
  16.     fi
  17.     file_name=$(echo "$1" | tr -t '[:upper:]' '[:lower:]')
  18.     if [ "$1" != "${file_name}" ]; then
  19.         mv "$1" "${file_name}"
  20.     fi
  21. }

  22. cd $1
  23. cd ..
  24. process_file $1
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-12-19 00:59:38 | 显示全部楼层

  1. #!/bin/bash
  2. #usage: $0 dirname

  3. find "$1" | sort -r | awk '
  4.     {
  5.      oldfile=$0;match($0, /\/[^\/]+$/)
  6.      sub(/\/[^\/]+$/, tolower(substr($0,RSTART,RLENGTH)),$0)
  7.      print "mv "" oldfile "" "" $0 """
  8.     }
  9. END{
  10.      sub(/\/$/,"",oldfile)
  11.      print "mv "" oldfile "" "" tolower(oldfile) """
  12.     }' | sh 2>/dev/null
复制代码

给个 awk 版的,不过似乎还是比较复杂
回复 支持 反对

使用道具 举报

发表于 2005-12-19 15:00:30 | 显示全部楼层

:)

for i in `ls *|awk '{print $1}'|tr ":" " "|sed -e '/^$/d'`; do echo $i;rename 'y/A-Z/a-z/' $i ; done
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-19 20:38:57 | 显示全部楼层
呵呵!谢谢两位!
awk我现在还不懂,我测试的时候出现:
awk: 3: unexpected character 0xef
不知道是怎么回事。
Qoo@Debian的好像在处理多层递归的时候有些问题呀。
回复 支持 反对

使用道具 举报

发表于 2005-12-19 21:17:34 | 显示全部楼层
不要从网页上复制程序,会引入多余的字符

完全用手工输入的方式建立源文件再试试看
回复 支持 反对

使用道具 举报

发表于 2005-12-22 20:23:03 | 显示全部楼层

  1. [No.661 20:21:26 test ]$ mkdir -p A/A/A B/B/B C/C/C
  2. [No.662 20:21:45 test ]$ ../change_dir.sh
  3. [No.663 20:21:48 test ]$ ls -R
  4. .:
  5. a  b  c

  6. ./a:
  7. a

  8. ./a/a:
  9. a

  10. ./a/a/a:

  11. ./b:
  12. b

  13. ./b/b:
  14. b

  15. ./b/b/b:

  16. ./c:
  17. c

  18. ./c/c:
  19. c

  20. ./c/c/c:

  21. [No.664 20:21:50 test ]$ cat ../change_dir.sh
  22. #! /bin/bash
  23. #set -x
  24. for DIR in $( find ./ -depth -type d )
  25. do
  26.         [[ $DIR == "./" ]] && exit
  27.         SUBDIR=${DIR##*/}
  28.         PARDIR=${DIR%%/$SUBDIR}
  29.         subdir=$(echo $SUBDIR | tr '[A-Z]' '[a-z]')
  30.         mv $DIR ${PARDIR}/$subdir
  31. done
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-12-26 15:15:21 | 显示全部楼层
ls|awk '{print "mv",$0,toupper($0)}'|sh
回复 支持 反对

使用道具 举报

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

本版积分规则

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