哪位大侠给个将一个目录下的所有文件名都由大写改成小写的shell或者c程序,121分呀!

cloudred 2001-03-13 07:30:00
加精
如题!
...全文
384 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hem 2001-05-17
  • 打赏
  • 举报
回复
我想 Perl 的正则表达式处理这个问题是很简单的 。 下回有空贴出来。
hem 2001-05-17
  • 打赏
  • 举报
回复
很好 , 源码相送。
hem 2001-05-17
  • 打赏
  • 举报
回复
很好 , 源码相送。 程序也写得不错
clansoft 2001-04-29
  • 打赏
  • 举报
回复
补充:程序命名为cvlc, 递归调用!
clansoft 2001-04-29
  • 打赏
  • 举报
回复
这还需要C吗?杀机用牛刀啊!

cvitem()
{
mv $1 `dirname $1`/`basename $1 | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
}

[ $# = 0 ] && { echo "Usage: lcdir item1 item2 ..."; exit; }

for item in $*
do
[ "`dirname $item`" != "`basename $item`" ] && {
[ -d $item ] &&
{
for subitem in `ls $item`
do
cvlc $item/$subitem
done
}
cvitem $item
}
done



wiler 2001-03-23
  • 打赏
  • 举报
回复
to cloudred:
怎么不给分啊?
cloudred 2001-03-23
  • 打赏
  • 举报
回复
我也正着急呢,我现在给分的窗口没有呀?怎么会事?
wiler 2001-03-19
  • 打赏
  • 举报
回复
这是我的c程序,在sco unix 5.0 下编译通过。
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
int ToUpper(char *);

void main(int ac,char **av)
{
DIR *dp;
struct dirent *dirptr;
struct stat stbuf;
char File_name[128];
char old_dir[1024][128];
int Cur_pos = -1; // 当前位置
int level = 0, levelnum[50], i;

for( i = 0; i < 50 ; i++ )
levelnum[i] = 0;
if( ac != 2 ){
printf(" Usage : %s path \n", av[0] );
exit(0);
}
else
if( chdir(av[1]) != -1 )
dp = opendir(".");
else
perror("opendir");

while(1){
while( ( dirptr = readdir(dp) ) != NULL ){
if( stat( dirptr->d_name, &stbuf ) == -1 ){
perror("stat");
exit(1);
}
if( strcmp( dirptr->d_name,"." ) != 0&& strcmp( dirptr->d_name, ".." ) != 0 ){
strcpy(File_name,dirptr->d_name);
ToUpper(File_name);
rename( dirptr->d_name,File_name );
printf("RENAME %s => %s OK\n",dirptr->d_name,File_name);
}
/* 保存目录 */
if( ( stbuf.st_mode&S_IFMT ) != S_IFREG )
if( strcmp( dirptr->d_name,"." ) != 0&& strcmp( dirptr->d_name, ".." ) != 0 ){
strcpy( old_dir[++Cur_pos],File_name);
levelnum[ level ] ++;
}
}
closedir(dp);
if( Cur_pos == -1 ) break;
else {
if( levelnum[ level ] == 0 ){
chdir("..");
if( levelnum[ --level ] == 0 ){
chdir("..");
level --;
if ( level == -1 )
break;
}
}
if( chdir(old_dir[Cur_pos]) != -1 ){
levelnum[ level ] --;
level ++;
Cur_pos --;
dp = opendir(".");
}
else
perror("opendir");
}
}
exit(0);
}
int ToUpper(char *str)
{
int i;

for(i = 0; i < strlen(str) ; i++ ){
if( str[i] <= 'z' &&str[i] >= 'a' )
str[i] = toupper( str[i] );
}
return 1;
}
cloudred 2001-03-18
  • 打赏
  • 举报
回复
willbe:对!当然是越完善越好了。

下面是我根据out4b的程序修改后的

#!/bin/sh
#notice chmod +x to this script before running
#
for f in `find . -name "*"`
do
echo $f>tmp1
tr "[:upper:]" "[:lower:]" < tmp1 >tmp2
mv $f `cat tmp2`
done
rm tmp1
rm tmp2

当然不能修改目标目录下的大写子目录的文件名,解决了我遇到的第二个问题。
WillBe 2001-03-18
  • 打赏
  • 举报
回复
我本来很有兴趣些个C程序完成这个功能的,可惜近来有点忙,稍后再写。
WillBe 2001-03-16
  • 打赏
  • 举报
回复
要求目标目录下的子目录中的文件都要改吗?
out4b 2001-03-14
  • 打赏
  • 举报
回复
#!/bin/sh
#notice chmod +x to this script before running
#
for f in `find . -name "*"`;
do
mv $f `echo $f | tr '[A-Z] '[a-z]'`
done




out4b
out4b 2001-03-14
  • 打赏
  • 举报
回复
sorry, 分号应该去掉. 另外关于大写的目录名, 可以用比较麻烦一点的方法写出来, 这里我没有unix环境, 暂时就不试了. 以后再贴吧.



out4b

cloudred 2001-03-14
  • 打赏
  • 举报
回复
out4b兄:
上面的shell在我机子上运行有两个问题:
第一个还好说:从理论上说,如果当前目录下面有一大写的子目录,子目录里有一些大写的文件,那肯定不行了!因为可能子目录还没改成小写。这个要说也不算大问题!
致命的是,除掉上面问题的影响,还是不能转换成功,运行的结果好象是
mv 原来的文件名 原来的文件名,
挺怪的,如果目录下面只有一个文件名AAA的话,运行后变成了aaa,多了的情况好象就不行了。
对于for语句后的“分号”,我凭感觉觉得好象放的不是位置,请明示

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧