LinuxSir.cn,穿越时空的Linuxsir!

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

探讨一下,关于xargs的困惑

[复制链接]
发表于 2006-1-4 14:53:44 | 显示全部楼层 |阅读模式
实现一个很普通的功能,就是循环地把一个目录下的所有文件名(包括子目录和子目录的文件)转换为小写。偶知道有脚本可以完成,但是偶想用脚本一句话搞定,挑战一下自己。结果遇到很多问题,希望大虾帮助解答一下

很容易的想到
find . -exec sh -c 'mv -f "$0″ `echo "$0″ | tr "[A-Z]" "[a-z]"` > /dev/null 2>&1′ {} \;
可是这样的话无法处理子目录的嵌套情况,必须find的结果进行sort -r排序才行。

于是想到
find . | sort -r | xargs mv -f "$0" `echo "$0″ | tr "[A-Z]" "[a-z]"` > /dev/null 2>&1′
发现$0中多了一个'-bash'的字符串(这是问题一,-bash怎么出来的?),于是改成$1
find . | sort -r | xargs mv -f "$1" `echo "$1″ | tr "[A-Z]" "[a-z]"` > /dev/null 2>&1′

发现 `echo "$1″ | tr "[A-Z]" "[a-z]"` 不起作用,大小写没有被转换,想了半天,写出下面的脚本
find . | sort -r | xargs mv -f "$1" `xargs echo "$1″ | tr "[A-Z]" "[a-z]"` > /dev/null 2>&1′

这回大小写倒是转换了,但是第一个mv -f "$1"的$1大小写也被转换了,晕!(问题二)

不知道是哪里写错了
发表于 2006-1-4 17:10:40 | 显示全部楼层

  1. ls [A-Z]*|awk '{print "mv",$0,tolower($0)}'|sh
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-4 18:44:09 | 显示全部楼层
这个脚本只能解决一层目录的问题,比如我得目录机构如下
A -- B
   |
   _ CCC -- EEE -- ABC.text
   |
   _ DDD

就必须使用find,然后从最里层改起,先mvABC.txt,再mv EEE,再mv CCC
回复 支持 反对

使用道具 举报

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

本版积分规则

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