LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: mengzhihai

Bourne shell去掉扩展名及取得文件的大小。

[复制链接]
发表于 2007-6-3 11:04:14 | 显示全部楼层
又学到东西了。
回复 支持 反对

使用道具 举报

发表于 2007-6-3 16:32:40 | 显示全部楼层
Post by FreeOrDie
谢谢biinn,以前见过字符串匹配居然一点印象没有,呵呵
不过这句好像也不对吧,应该prefix=${filename%.*}?


对,我的笔误,呵呵。
回复 支持 反对

使用道具 举报

发表于 2007-6-3 17:45:57 | 显示全部楼层
JESSE@localhost\ ./getinfo sample getinfo
You specified file sample
-----------------------------
prefix   sample
size     2050
You specified file getinfo
-----------------------------
prefix   getinfo
size     220

当然别用wc了,文件的size记录在inode里了,当然不必去wc再数一次了。
#! /bin/bash

for arg in $*
do
        prefix=${arg%.*}
        size=`ls -l "$arg" | awk '{ print $5 }'`

        echo "You specified file $arg"
        echo "-----------------------------"
        echo "prefix     $prefix"
        echo "size       $size"
done

exit 0
回复 支持 反对

使用道具 举报

发表于 2007-6-4 01:43:53 | 显示全部楼层
ls 也有问题的,在一个很多文件的目录里边(上千),ls效率不高。
回复 支持 反对

使用道具 举报

发表于 2007-6-4 02:21:57 | 显示全部楼层
Post by 晨想
ls 也有问题的,在一个很多文件的目录里边(上千),ls效率不高。

尊敬的版主
偶是新手,它的过程是这样的吗? 根据指定的file name查看目录项里与之对应的inode号,然后查看inode表,读取size属性。那么这样应该效率没有不高啊,还有更好的办法吗?我很想知道:-) 谢谢版主
回复 支持 反对

使用道具 举报

发表于 2007-6-5 09:07:26 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. #include <fcntl.h>
  8. #include <stdint.h>
  9. int size(char *dev_name, uint64_t *dev_size)
  10. {
  11.         int fd;
  12.         if (dev_name == NULL || dev_size == NULL){
  13.                 fprintf(stderr, "NULL pointer!\n");
  14.                 return -1;
  15.         }
  16.         fd = open(dev_name, O_RDWR);
  17.         if (fd < 0){
  18.                 fprintf(stderr, "Can not open file %s!\n", dev_name);
  19.                 return -1;
  20.         }
  21.         *dev_size = (uint64_t)lseek64(fd, 0, SEEK_END);
  22.         if (*dev_size == -1){
  23.                 fprintf(stderr, "Lseek file %s failure!\n", dev_name);
  24.                 close(fd);
  25.                 return -1;
  26.         }
  27.         close(fd);
  28.         return 0;
  29. };
  30. int main(int argc, char **argv)
  31. {
  32.         int i;
  33.         uint64_t sizeofbyte;
  34.         int ret;
  35.        
  36.         for(i = 1; i < argc; i++) {
  37.                 ret = size(argv[i], &sizeofbyte);
  38.                 if (ret) {
  39.                         fprintf(stderr, "get size of file %s failure\n", argv[i]);
  40.                 } else {
  41.                         printf("the %s size is %llu in bype\n", argv[i], sizeofbyte);
  42.                 }
  43.         }
  44.         return 0;
  45. }
复制代码
自己写一个,没有测试,大体上没有问题的。
回复 支持 反对

使用道具 举报

发表于 2007-6-5 09:15:45 | 显示全部楼层
对了,如果要支持大文件的话(文件大小超出2G),那么需要在编译的时候指定LARGEFILE64_SOURCE选项。如下所示:
gcc size.c -o size -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE

然后调用./size [文件列表]即可
回复 支持 反对

使用道具 举报

发表于 2007-6-5 13:10:48 | 显示全部楼层
呵呵 厉害呀 :-)
回复 支持 反对

使用道具 举报

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

本版积分规则

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