免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2527 | 回复: 9
打印 上一主题 下一主题

在线等待 : 关于rename批量修改文件名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-24 13:34 |只看该作者 |倒序浏览
10 int main(void)
     11 {
     12
     13     DIR *dp = opendir("./dir");
     14     if(dp == NULL) {
     15         printf("opendir()\n");
     16         exit(1);
     17     }
     18
     19     //
     20     struct dirent *ptr;
     21     while( (ptr=readdir(dp)) != NULL) {
     23         rename("*.c", "*.d"); // 这里不知道如何是好!
     24     }
     25
     26     exit(0);
     27 }

在dir目录下有ok1.c  ok2.c ok3.c wwww.c  fdjalj.c fjdosaj.c  就是有很多文件是以.c为后缀的,
当然,也有的文件是以.d作为后缀的, 也有没有后缀的。
我现在希望把.c为后缀的文件更名为以.d为后缀。其他的文件不动。
该如何做到呢?
谢谢。。。。。。。。。。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-11-24 13:41 |只看该作者
  1. DIR *dp = opendir("./dir");
  2. if(dp == NULL) {
  3.     printf("opendir()\n");
  4.     exit(1);
  5. }

  6. struct dirent *ptr;
  7. while( (ptr=readdir(dp)) != NULL) {
  8.     // 这里不知道如何是好!
  9.     if ( strcmp( ptr->d_name + strlen(ptr->d_name) - 2, ".c" ) == 0 ){
  10.         char *newName;
  11.         newName = strdup( ptr->d_name );
  12.         newName[ strlen(newName)-1 ] = 'd';
  13.         rename( ptr->d_name, newName );
  14.         free( newName );
  15.     }
  16. }
复制代码

[ 本帖最后由 flw 于 2006-11-25 11:18 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-11-24 15:49 |只看该作者
这种事还是用shell解决的好

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2006-11-24 15:51 |只看该作者
原帖由 edwardcj 于 2006-11-24 15:49 发表
这种事还是用shell解决的好

C 也不复杂,而且如果主程序是 C 的话,调用 shell 也很烦的。
还得 snprintf 出一个 cmd,再 system,还得检查有没有出错,还不如用 C 写呢。

论坛徽章:
0
5 [报告]
发表于 2006-11-24 15:55 |只看该作者
原帖由 flw 于 2006-11-24 15:51 发表

C 也不复杂,而且如果主程序是 C 的话,调用 shell 也很烦的。
还得 snprintf 出一个 cmd,再 system,还得检查有没有出错,还不如用 C 写呢。


那倒是,呵呵

论坛徽章:
0
6 [报告]
发表于 2006-11-24 16:30 |只看该作者
wolf@linux:~/tmp/linux> ls ./mm
bootmem.c      hugetlb.c    mempool.c   nommu.c           proc_mm.c    swap.c        vmscan.c
fadvise.c      internal.h   mincore.c   oom_kill.c        readahead.c  swapfile.c
filemap.c      Kconfig      mlock.c     page_alloc.c      rmap.c       swap_state.c
filemap.h      madvise.c    mmap.c      page_io.c         shmem_acl.c  thrash.c
filemap_xip.c  Makefile     mprotect.c  page-writeback.c  shmem.c      tiny-shmem.c
fremap.c       memory.c     mremap.c    pdflush.c         slab.c       truncate.c
highmem.c      mempolicy.c  msync.c     prio_tree.c       sparse.c     vmalloc.c
wolf@linux:~/tmp/linux> find ./ -name '*.c' -exec rename .c .d {} \;
wolf@linux:~/tmp/linux> ls ./mm
bootmem.d      hugetlb.d    mempool.d   nommu.d           proc_mm.d    swap.d        vmscan.d
fadvise.d      internal.h   mincore.d   oom_kill.d        readahead.d  swapfile.d
filemap.d      Kconfig      mlock.d     page_alloc.d      rmap.d       swap_state.d
filemap.h      madvise.d    mmap.d      page_io.d         shmem_acl.d  thrash.d
filemap_xip.d  Makefile     mprotect.d  page-writeback.d  shmem.d      tiny-shmem.d
fremap.d       memory.d     mremap.d    pdflush.d         slab.d       truncate.d
highmem.d      mempolicy.d  msync.d     prio_tree.d       sparse.d     vmalloc.d
wolf@linux:~/tmp/linux>

论坛徽章:
0
7 [报告]
发表于 2006-11-25 10:12 |只看该作者
这种事还是用shell解决的好

完全可以,过程也不复杂,不需要C,就是速度慢一些:

MASTER=
for file in `ls -1|grep "\.c"|sed /grep/d`
do
        MASTER=`echo ${file} | awk -F'.' '{print $1}'`
        mv ${file} ${MASTER}.d
done

论坛徽章:
0
8 [报告]
发表于 2006-11-25 10:16 |只看该作者
通配符,是 shell 的事情,用到系统调用上,恐怕不可以吧

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-11-25 11:02 |只看该作者
原帖由 langue 于 2006-11-25 10:16 发表
通配符,是 shell 的事情,用到系统调用上,恐怕不可以吧

系统调用里当然没有通配符了。
但是 libc 里有的。
man 3 glob

论坛徽章:
0
10 [报告]
发表于 2006-11-26 11:43 |只看该作者
通配符,谁解析它就要读目录,步骤少不了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP