精华内容
下载资源
问答
  • 你可能有时需要在 Linux 上创建或者删除符号链接。如果有,你知道该怎样做吗?之前你做过吗?你踩坑没有?如果你踩过坑,那没什么问题。如果还没有,别担心,我们将在这里帮助你。 使用 rm 和 unlink 命令就能完成...
  • 一个 shell 脚本文件,用于删除指定目录下无效链接文件,可利用标准输入指派多个处理目标
  • NULL 博文链接:https://zl-go.iteye.com/blog/1893840
  • Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。 链接是一种在...
  •  在Linux系统中,通过rm删除文件将会从文件系统的目录结构上解除链接(unlink),如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件磁盘空间也一直被占用  这样会导致我们明明删除文件,...
  • NULL 博文链接:https://skyline888.iteye.com/blog/786314
  • linux删除文件的 操纵

    千次阅读 2017-03-07 13:16:42
    linux删除 文件的 方法::: 1- remove remove(删除文件) 相关函数 link,rename,unlink 表头文件 #include 定义函数 int remove(const char * pathname); 函数说明 remove()会删除参数pathname指定的...

    linux   下删除 文件的 方法:::

    1-  remove

    remove(删除文件)
    相关函数 link,rename,unlink
    表头文件 #include<stdio.h>
    定义函数 int remove(const char * pathname);
    函数说明 remove()会删除参数pathname指定的文件。如果参数pathname为一文件,则调用unlink()处理,若参数pathname为一目录,则调用rmdir()来处理。请参考unlink()与rmdir()。
    返回值 成功则返回0,失败则返回-1,错误原因存于errno。
    错误代码 EROFS 欲写入的文件存在于只读文件系统内
    EFAULT 参数pathname指针超出可存取内存空间
    ENAMETOOLONG 参数pathname太长
    ENOMEM 核心内存不足
    ELOOP 参数pathname有过多符号连接问题
    EIO I/O 存取错误。


    2-  unlink

    int unlink( const char* pathname);

    此函数删除目录项,并将由pathname所引用文件的链接计数减1。如果还有指向该文件的其它链接,则仍可通过其他链接访问该文件的数据。如果出错,则不对该文件做任何更改。

    只有当链接计数达到0时,该文件的内容才可被删除。

    关闭一个文件时,内核首先检查打开该文件的进程数。如果该数达到0,然后内核检查其链接数,如果这个数也是0,那么就删除该文件的内容。

    #include "apue.h" 
    #include 
    int 
    main(void) 

        int fd; 
        char buf[20] = {0}; 
        if ((fd =open("tempfile", O_RDWR)) < 0) 
            err_sys("open error"); 
        if (unlink("tempfile") < 0) 
            err_sys("unlink error"); 
        printf("file unlinked/n"); 
        read(fd, buf, sizeof(buf));//you could still read this after unlink 
        printf("%s/n", buf); 
        sleep(15); 
        printf("done/n"); 
        exit(0); 
    }

    unlink的这种性质经常被用来确保即使是在该程序崩溃时,它所创建的临时文件也不会遗留下来。进程用open或create创建一个文件,然后立即调用unlink。因为该文件仍旧是打开的,所以不会将其内容删除。只有当进程关闭该文件或终止时(在这种情况下,内核会关闭该进程打开的全部文件),该文件的内容才会被删除。

    如果pahtname是符合链接,那么unlink删除该符号链接,而不会删除由该链接所引用的文件。

    #include

    int remove(const char* pathname);

    我们也可以用remove函数解除对一个文件或目录的链接。对于文件,remove的功能与unlink相同。

    ISO C指定remove函数删除一个文件,这更改了UNIX系统历来使用的名字unlink,其原因是实现C标准的大多数非UNIX系统并不支持文件链接。



    3-system

    这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定? 

      下面对system函数做一个简单的介绍: 
    头文件 
      #i nclude 
    定义函数 
      int system(const char * string); 
    函数说明 
      system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。 返回值 =-1:出现错误 =0:调用成功但是没有出现子进程 >0:成功退出的子进程的id 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。 
    附加说明 
      在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。 system函数已经被收录在标准c库中,可以直接调用,使用system()函数调用系统命令的基本使用方法如下: 
    #include  
    int main()
    system("mkdir $HOME/.SmartPlatform/"); 
    system("mkdir $HOME/.SmartPlatform/Files/"); 
    system("cp mainnew.cpp $HOME/.SmartPlatform/Files/"); 
    return 0; 
      下面我们来看看system函数的源码: 
    #include  
    #include  
    #include  
    #include  
    int system(const char * cmdstring)
    pid_t pid; 
    int status; 
    if(cmdstring == NULL)
    return (1); 
    if((pid = fork())<0)
    status = -1; 
    else if(pid = 0)
    {
      execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); -exit(127); //子进程正常执行则不会执行此语句 } 
    else
    while(waitpid(pid, &status, 0) < 0)
    {
      if(errno != EINTER){ status = -1; break; 
    }
     
    return status; 
    花了两天时间仔细研究了一下,在网上发现了一篇精品博客,介绍的很详细了,谢谢博主,直接转, 原文如下: 
    http://my.oschina.net/renhc/blog/53580 
    【C/C++】Linux下使用system()函数一定要谨慎 
    曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入。只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位,这才是重点。当初因为这个函数风险较多,故抛弃不用,改用其他的方法。这里先不说我用了什么方法,这里必须要搞懂system()函数,因为还是有很多人用了system()函数,有时你不得不面对它。 
    先来看一下system()函数的简单介绍: 
    #include  
    int system(const char *command); 
    system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored. system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令; 在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说; 在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。 
    再来看一下system()函数返回值: 
    The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise. This latter return status is in the format specified in wait(2). Thus, the exit code of the command will be WEXITSTATUS(status). In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127). If the value of command is NULL, system() returns nonzero if the shell is available, and zero if not. 
    为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作: 
    1.fork一个子进程; 
    2.在子进程中调用exec函数去执行command; 
    3.在父进程中调用wait去等待子进程结束。 对于fork失败,system()函数返回-1。 如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。 (注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了) 如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127. 如果command为NULL,则system()函数返回非0值,一般为1. 
    看一下system()函数的源码 
    看完这些,
    我想肯定有人对system()函数返回值还是不清楚,看源码最清楚,下面给出一个system()函数的实现: 
    int system(const char * cmdstring) 
    pid_t pid; 
    int status; 
    if(cmdstring == NULL) 
    return (1); //如果cmdstring为空,返回非零值,一般为1 
    if((pid = fork())<0) 
     status = -1; //fork失败,返回-1 
    else if(pid == 0) 
    execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); 
    _exit(127); // exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的进程就不存在啦~~ 
    else //父进程 
    while(waitpid(pid, &status, 0) < 0) 
    if(errno != EINTR) 
    status = -1; //如果waitpid被信号中断,则返回-1 
    break; 
    return status; //如果waitpid成功,则返回子进程的返回状态 

    仔细看完这个system()函数的简单实现,那么该函数的返回值就清晰了吧,那么什么时候system()函数返回0呢?只在command命令返回0时。 看一下该怎么监控system()函数执行状态 这里给我出的做法: 
    int status; 
    if(NULL == cmdstring) //如果cmdstring为空趁早闪退吧,尽管system()函数也能处理空指针 
    return XXX; 
    status = system(cmdstring); 
    if(status < 0) 
    printf("cmd: %s\t error: %s", cmdstring, strerror(errno)); // 这里务必要把errno信息输出或记入Log 
    return XXX; 

    if(WIFEXITED(status)) 
    printf("normal termination, exit status = %d\n", WEXITSTATUS(status)); //取得cmdstring执行结果     } 
    else if(WIFSIGNALED(status)) 
    printf("abnormal termination,signal number =%d\n", WTERMSIG(status)); //如果cmdstring被信号中断,取得信号值 
    else if(WIFSTOPPED(status)) 
    printf("process stopped, signal number =%d\n", WSTOPSIG(status)); //如果cmdstring被信号暂停执行,取得信号值 

    至于取得子进程返回值的相关介绍可以参考另一篇文章:http://my.oschina.net/renhc/blog/35116 system()函数用起来很容易出错,返回值太多,而且返回值很容易跟command的返回值混淆。
    这里推荐使用popen()函数替代,关于popen()函数的简单使用也可以通过上面的链接查看。  
    popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值: 成功返回子进程的status,使用WIFEXITED相关宏就可以取得command的返回结果; 失败返回-1,我们可以使用perro()函数或strerror()函数得到有用的错误信息。 这篇文章只涉及了system()函数的简单使用,还没有谈及SIGCHLD、SIGINT和SIGQUIT对system()函数的影响,事实上,之所以今天写这篇文章,是因为项目中因有人使用了system()函数而造成了很严重的事故。现像是system()函数执行时会产生一个错误:“No child processes”。 关于这个错误的分析,感兴趣的朋友可以看一下:http://my.oschina.net/renhc/blog/54582 2012-04-14 
    qdurenhongcai@163.com 转载请注明出处。 

     下面是第二篇,对于system()函数的错误详细分析,再次感谢博主 
    【C/C++】Linux下system()函数引发的错误 
    今天,一个运行了近一年的程序突然挂掉了,问题定位到是system()函数出的问题,关于该函数的简单使用在我上篇文章做过介绍: http://my.oschina.net/renhc/blog/53580 
    先看一下问题 简单封装了一下system()函数: 
    int pox_system(const char *cmd_line) 
    return system(cmd_line); 
    函数调用: 
    int ret = 0; 
    ret = pox_system("gzip -c /var/opt/I00005.xml > /var/opt/I00005.z"); 
     if(0 != ret) 
     
     Log("zip file failed\n"); 
     }
     问题现象:每次执行到此处,都会zip failed。而单独把该命令拿出来在shell里执行却总是对的,事实上该段代码已运行了很长时间,从没出过问题。 
    糟糕的日志 
    分析log时,我们只能看到“zip file failed”这个我们自定义的信息,至于为什么fail,毫无线索。 那好,我们先试着找出更多的线索: 
     int ret = 0; 
     ret = pox_system("gzip -c /var/opt/I00005.xml > /var/opt/I00005.z"); 
     if(0 != ret) 
     
     Log("zip file failed: %s\n", strerror(errno)); //尝试打印出系统错误信息 
     
    我们增加了log,通过system()函数设置的errno,我们得到一个非常有用的线索:system()函数失败是由于“ No child processes”。继续找Root Cause。 
    谁动了errno 
    我们通过上面的线索,知道system()函数设置了errno为ECHILD,然而从system()函数的man手册里我们找不到任何有关EHILD的信息。我们知道system()函数执行过程为:fork()->exec()->waitpid().  很显然waitpid()有重大嫌疑,我们去查一下man手册,看该函数有没有可能设置
    ECHILD: ECHILD (for waitpid() or waitid()) The process specified by pid (waitpid()) or idtype and id (waitid()) does not exist or is not a child of the calling process. (This can happen for one's own child if the action for SIGCHLD is set to SIG_IGN. See also the Linux Notes section about threads.) 
    果然有料,如果SIGCHLD信号行为被设置为SIG_IGN时,waitpid()函数有可能因为找不到子进程而报ECHILD错误。似乎我们找到了问题的解决方案:在调用system()函数前重新设置SIGCHLD信号为缺省值,即signal(SIGCHLD, SIG_DFL)。
    我们很兴奋,暂时顾不上看Linux Notes部分,直接加上代码测试!乖乖,问题解决了! 
    如此处理问题是你的风格吗 正当我们急于check in 代码时,一个疑问出现了:“这个错误为什么以前没发生”?是啊,运行良好的程序怎么突然就挂了呢?首先我们代码没有改动,那么肯定是外部因素了。一想到外部因素,我们开始抱怨:“肯定是其他组的程序影响我们了!”但抱怨这是没用的,如果你这么认为,那么请拿出证据!但静下来分析一下不难发现,这不可能是其他程序的影响,其他进程不可能影响我们进程对信号的处理方式。 system()函数之前没出错,是因为systeme()函数依赖了系统的一个特性,那就是内核初始化进程时对SIGCHLD信号的处理方式为SIG_DFL,这是什么什么意思呢?即内核发现进程的子进程终止后给进程发送一个SIGCHLD信号,进程收到该信号后采用SIG_DFL方式处理,那么SIG_DFL又是什么方式呢?SIG_DFL是一个宏,定义了一个信号处理函数指针,事实上该信号处理函数什么也没做。这个特性正是system()函数需要的,system()函数首先fork()一个子进程执行command命令,执行完后system()函数会使用waitpid()函数对子进程进行收尸。 通过上面的分析,我们可以清醒的得知,system()执行前,SIGCHLD信号的处理方式肯定变了,不再是SIG_DFL了,至于变成什么暂时不知道,事实上,我们也不需要知道,我们只需要记得使用system()函数前把SIGCHLD信号处理方式显式修改为SIG_DFL方式,同时记录原来的处理方式,使用完system()后再设为原来的处理方式。
    这样我们可以屏蔽因系统升级或信号处理方式改变带来的影响。 验证猜想 我们公司采用的是持续集成+敏捷开发模式,每天都会由专门的team负责自动化case的测试,每次称为一个build,我们分析了本次build与上次build使用的系统版本,发现版本确实升级了。于是我们找到了相关team进行验证,我们把问题详细的描述了一下,很快对方给了反馈,下面是邮件回复原文: LIBGEN 里新增加了SIGCHLD的处理。将其ignore。为了避免僵尸进程的产生。 看来我们的猜想没错!问题分析到这里,解决方法也清晰了,于是我们修改了我们的pox_system()函数: 
    typedef void (*sighandler_t)(int); 
    int pox_system(const char *cmd_line) 
     int ret = 0; 
    sighandler_t old_handler; 
    old_handler = signal(SIGCHLD, SIG_DFL); 
     ret = system(cmd_line); 
     signal(SIGCHLD, old_handler); 
     return ret; 
     
    我想这是调用system()比较完美的解决方案了,同时使用pox_system()函数封装带来了非常棒的易维护性,我们只需要修改此处一个函数,其他调用处都不需要改。 后来,查看了对方修改的代码,果然从代码上找到了答案: 
     if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) 
     return -1; 
     
    else { 
     return 0; 
     } 其他思考 我们公司的代码使用SVN进程管理的,到目前为止有很多branch,逐渐的,几乎每个branch都出现了上面的问题,于是我逐个在各个branchc上fix这个问题,几乎忙了一天,因为有的branch已被锁定,再想merge代码必须找相关负责人说明问题的严重性,还要在不同的环境上测试,我边做这些边想,系统这样升级合适吗? 首先,由于系统的升级导致我们的代码在测试时发现问题,这时再急忙去fix,造成了我们的被动,我想这是他们的一个失误。你做的升级必须要考虑到对其他team的影响吧?何况你做的是系统升级。升级前需要做个风险评估,对可能造成的影响通知大家,这样才职业嘛。 再者,据他们的说法,修改信号处理方式是为了避免僵尸进程,当然初衷是好的,但这样的升级影响了一些函数的使用方式,比如system()函数、wait()函数、waipid()、fork()函数,这些函数都与子进程有关,如果你希望使用wait()或waitpid()对子进程收尸,那么你必须使用上面介绍的方式:在调用前(事实上是fork()前)将SIGCHLD信号置为SIG_DFL处理方式,调用后(事实上wait()/waitpid()后)再将信号处理方式设置为从前的值。你的系统升级,强制大家完善代码,确实提高了代码质量,但是对于这种升级我不是很认同,试想一下,你见过多少fork()->waitpid()前后都设置SIGCHLD信号的代码? 
    使用system()函数的建议 上在给出了调用system()函数的比较安全的用法,但使用system()函数还是容易出错,错在哪?
    那就是system()函数的返回值,关于其返回值的介绍请见上篇文章。system()函数有时很方便,但不可滥用! 
    1、建议system()函数只用来执行shell命令,因为一般来讲,system()返回值不是0就说明出错了; 
    2、建议监控一下system()函数的执行完毕后的errno值,争取出错时给出更多有用信息; 
    3、建议考虑一下system()函数的替代函数popen();其用法在我的另一篇文章有介绍。 

    qdurenhongcai@163.com 转载请注明出处。 


    继续转该牛X博主的博客,对于上文提到的system()函数的替换函数popen()的详细介绍...万分感谢博主:
     【IPC通信】基于管道的popen和pclose函数 
    标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行。 这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程。 popen函数还创建一个管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数。下在给出popen、pclose的定义: 
    #include 

    FILE * popen( const char * command,const char * type); 
     int pclose(FILE * stream); 
    下面通过例子看下popen的使用: 假如我们想取得当前目录下的文件个数,在shell下我们可以使用:
     ls | wc -l 我们可以在程序中这样写: 
     #include 
    #include 
    #include 
    #include 
     #define MAXLINE 1024 
     int main() 
    char result_buf[MAXLINE], command[MAXLINE]; 
    int rc = 0; // 用于接收命令返回值 
    FILE *fp; 
    snprintf(command, sizeof(command), "ls ./ | wc -l");
     fp = popen(command, "r"); 
    if(NULL == fp) 
    perror("popen执行失败!"); 
    exit(1); 
    while(fgets(result_buf, sizeof(result_buf), fp) != NULL) 
     if('\n' == result_buf[strlen(result_buf)-1]) 
    result_buf[strlen(result_buf)-1] = '\0'; 
    printf("命令【%s】 输出【%s】\r\n", command, result_buf); 
     rc = pclose(fp); 
    if(-1 == rc) 
    perror("关闭文件指针失败"); 
     exit(1); 
    else 
    printf("命令【%s】子进程结束状态【%d】命令返回值【%d】\r\n", command, rc, WEXITSTATUS(rc)); 
     return 0; 
    编译并执行: 
    $ gcc popen.c 
    $ ./a.out 命令【ls ./ | wc -l】 
    输出【2】 命令【ls ./ | wc -l】子进程结束状态【0】命令返回值【0】 
    上面popen只捕获了command的标准输出,如果command执行失败,子进程会把错误信息打印到标准错误输出,父进程就无法获取。比如,command命令为“ls nofile.txt” ,事实上我们根本没有nofile.txt这个文件,这时shell会输出“ls: nofile.txt: No such file or directory”。这个输出是在标准错误输出上的。通过上面的程序并无法获取。 注:如果你把上面程序中的command设成“ls nofile.txt”,编译执行程序你会看到如下结果: 
    $ gcc popen.c 
    $ ./a.out ls: nofile.txt: No such file or directory 
    命令【ls nofile.txt】子进程结束状态【256】命令返回值【1】 需要注意的是第一行输出并不是父进程的输出,而是子进程的标准错误输出。 有时子进程的错误信息是很有用的,那么父进程怎么才能获取子进程的错误信息呢? 这里我们可以重定向子进程的错误输出,让错误输出重定向到标准输出(2>&1),这样父进程就可以捕获子进程的错误信息了。
    例如command为“ls nofile.txt 2>&1”,输出如下: 
    命令【ls nofile.txt 2>&1】 输出【ls: nofile.txt: No such file or directory】 
    命令【ls nofile.txt 2>&1】子进程结束状态【256】命令返回值【1】 
    附:子进程的终止状态判断涉及到的宏,设进程终止状态为status. WIFEXITED(status)如果子进程正常结束则为非0值。 WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。 WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真。 WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。 WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。 WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。 2011-11-12 任洪彩
     qdurenhongcai@163.com 转载请注明出处。 

    但是根据上面那位博主说的使用system()函数前把SIGCHLD信号处理方式显式修改为SIG_DFL方式,同时记录原来的处理方式,使用完system()后再设为原来的处理方式后,程序还是会死掉.而且看不到system的返回值是多少(因为system在执行系统命令的时候,程序已经挂掉了),故暂时使用博主提到的第二种解决方式使用popen()函数替代system()函数.修改后的函数如下 
    int my_system(const char * cmd) 
    FILE * fp; 
    int res; char buf[1024]; 
    if (cmd == NULL) 
    printf("my_system cmd is NULL!\n");
     return -1;
     
    if ((fp = popen(cmd, "r") ) == NULL) 
    perror("popen");
     printf("popen error: %s/n", strerror(errno)); return -1; 
    else
     {
     while(fgets(buf, sizeof(buf), fp)) 
    printf("%s", buf); 
    if ( (res = pclose(fp)) == -1) 
    printf("close popen file pointer fp error!\n"); return res;
     
    else if (res == 0) 
    {
     return res;
     
    else 
    printf("popen res is :%d\n", res); return res; 
    }
     
    此时调用my_system()来执行system函数的功能(my_system函数中是使用popen()函数来实现的), 测试了一天,没有再次出现程序突然死掉的问题(修改前连续循环调用system()函数测试,每10次就会至少导致程序挂掉一次.连续不停顿的调用). 以上是我对这个问题的总结,先做个记录,待修复bug后再回来仔细研究.


    4-exec

    展开全文
  • Linux文件系统 及文件系统删除原理

    千次阅读 2020-03-02 20:23:25
    一、Linux文件系统 inode block superblock inode table : inode 元数据 block的存放地址 data area : data 元数据: 文件的属性信息 大小 创建时间 权限 surperblock:记录文件系统整体信息 inode 总量 已使用 ...

    本节内容:关于inode 、block、superblock的基础知识;文件删除原理;文件处理工具

    一、Linux文件系统 ( inode block superblock)

    linux文件系统简单分为inode table和date area

    inode: 存放元数据 (元数据:文件的属性信息 大小 创建时间 权限)
    block:存放实际数据
    surperblock:记录文件系统整体信息( inode 与block的总量 已使用 剩余)

    小文件问题:可能会使inode耗尽,使得文件文法创建。(磁盘利用率低)—>对于小文件比较多的场景,将block划分小一点。
    大文件问题:一个文件占用多个block,使得文件读写速率慢---->将block划分大一点。
    在这里插入图片描述
    inode中包含文件的元数据,用stat命令查看文件元数据

    	 [root@nebula ~]# stat anaconda-ks.cfg
    
     File: "anaconda-ks.cfg"
     		 Size: 939             Blocks: 8          IO Block: 4096   regular file 
    		Device: 802h/2050d      Inode: 142230      Links: 1
    		Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    		Access: 2020-02-12 03:32:02.709999481 +0800
    		Modify: 2020-02-12 03:32:03.369999480 +0800
    		Change: 2020-02-12 03:32:10.259999474 +0800
    
    blocks:占用磁盘块数
    IO block:IO块的大小
    device;所在设备
    Access: (0600/-rw-------) :访问权限
    

    二、Linux文件系统删除原理
    硬链接:
    具有相同INode节点号的文件互为硬链接文件
    删除硬链接文件或者删除源文件任意一个,文件数据实际并未删除
    只有删除源文件以及所对应的所有硬链接文件,文件数据才被删除,同时释放磁盘空间
    硬链接文件是文件的另一个入口
    可以通过设置硬链接文件防止误删

    软链接  符号链接
    	类似于windows上的快捷方式
    	软连接文件类似一个文本文件,存放的是源文件的路径
    	删除源文件,链接文件依然存在,但是无法指向源文件
    	软连接文件和源文件是不同类型的文件,也是不同的文件,inode号也不同
    	rm可以直接删除
    
    
    目录链接
    	对于目录来说,只能创建软连接
    	每一个目录下都有硬链接 . ..
    	对于父目录来说,子目录都会有指向父目录的链接   父目录链接数+1
    
    
    每一个文件链接计数器,  i_count  i_nlink
    	i_count:当前文件被调用的次数     内存引用计数器
    	i_nlink:链接的数量  硬链接的数量    磁盘引用计数器
    
    
    文件删除:i_count和i_nlink同时为0时,代表删除
    

    linux文件处理工具
    1、cut:数据切割
    1、字节
    2、字符
    3、区域
    -b:以字节为单位进行分割
    -c:以字符为单位
    -d:指定分隔符 默认是tab
    -f:配合-d使用 指定显示那个区域
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2、sort:用于字段排序

        -f:忽略大小写
    	-b:忽略最前面的空白字符
    	-M:以月份名字排序
    	-n:以纯数字排序
    	-u:相邻数据去重
    	-r:反向排序
    	-t:指定排序分隔符
    	-k:执行区间
    	-o  filename:将结果保存在filename中
    

    3、uniq:去除排序过的文件中重复的行

        -c:标注出现的次数
    	-d:只输出重复的行
    	-D:显示所有重复行
    	-f:跳过前N列   列是通过空白分割
    	-i:忽略大小写
    	-s N:跳过前N个字符
    	-u:只显示唯一的行
    	-w N:每行的第N个字符之后不做对照
    	-z:使用'\0'作为行结束符,而不是新换行
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    4.wc: word count

     	-c:统计字节数
    	-l:统计行数
    	-m:统计字符
    	-w:统计字数
    	-L:打印最长行的长度
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Linux文件链接如何删除

    千次阅读 2018-04-27 20:04:34
    创建软链接即用 ln -s 原始文件或文件夹 目标文件或文件夹 举例:当前目录是/local,而我经常要访问/usr/local/linux/work那么我就可以使用在local下建立... 当删除链接文件时,如果不小心会把原始文件删掉例:ln -s...
    创建软链接即用 ln -s 原始文件或文件夹 目标文件或文件夹   
     

    举例:

    当前目录是/local,而我经常要访问/usr/local/linux/work

    那么我就可以使用在local下建立一个文件linkwork,

    然后sudo ln -s /usr/local/linux/work  /local/linkwork

    即建立两者之间的链接。

     
    当删除链接文件时,如果不小心会把原始文件删掉
    例:
    ln -s /home/user/bak  /var/bak
    rm     /var/bak/   会提示bak是一个文件夹无法删除这时千万不要用 rm -rf /var/bak/ 来删除 否则你删除的并不是链接文件 而是真正的 /home/user/bak 文件夹
     
    想要删除链接文件要用以下命令 rm   /var/bak 只是少了一个“ / ” 删除的 就是链接文件, 也就是在文件的最后不要加上/
     
    结论:
    在删除文件时要小心
    在删除软链接文件时,小心使用
    展开全文
  • linux删除链接文件【原创】

    千次阅读 2019-04-12 08:58:00
    删除链接文件时,不要加“/”,去注意 正确方法: rm -rf ./softlinkfile 错误方法: rm -rf ./softlinkfile/ 上面错误的操作,这样会把软链接的源文件一同删除,请谨慎操作 转载于:...

    删除软链接文件时,不要加“/”,去注意

    正确方法:
    rm -rf ./softlinkfile
    
    
    错误方法:
    rm -rf ./softlinkfile/
    
    上面错误的操作,这样会把软链接的源文件一同删除,请谨慎操作

     

    转载于:https://www.cnblogs.com/paul8339/p/10693919.html

    展开全文
  • Linux恢复删除文件

    万次阅读 2017-10-11 09:49:08
    linux恢复删除文件 先介绍下一些文件的基本概念:   · 文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个...
  • 如何优雅地删除 Linux 中的垃圾文件

    千次阅读 2020-03-05 08:54:57
    不知道大家是否也跟我一样,是一只要把的自己电脑文件安排的条理有序,把没用的文件会及时删掉的程序猿呢?如果是的话,那么我们可以愉快地探讨下文章的内容。如果不是的话,你也可以留下来凑凑热闹嘛(>-...
  • Linux删除大量文件效率对比

    千次阅读 2020-05-03 23:22:31
    今天我们来测试一下Linux下面删除大量文件的效率。 首先建立50万个文件 $ test for i in $(seq 1 500000);do echo text >>$i.txt;done rm删除 $ time rm -f * zsh: sure you want to delete all the files in...
  • Linux删除正在进行读写操作的文件

    千次阅读 2019-07-15 17:41:49
    多进程环境下,打开同一个文件,进行读写操作过程中,如果其中一个进程删除这个文件,那么,另外正在读写这个文件会发生什么呢?...Linux 是通过 link 的数量来控制文件删除,只有当一个文件不存在任何 link...
  • Linux删除链接

    千次阅读 2018-12-20 09:44:56
    首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即可) 下面我们来创建test_chk目录 的软链接 #ln-s test_chk test_chk_ln ...
  • java删除linux系统中文件

    千次阅读 2020-04-25 13:54:55
    方法一:利用java中的文件delete方法 ...eg://tmp//linuxup//删除的文件名 localPath = "/tmp"; File delfile = new File("//tmp"+good.getGpictureid().replace("linuxup","/")); // 路径为文件...
  • Linux中是如何删除特殊名称文件

    千次阅读 2020-04-19 11:29:17
    对于链接文件,只是删除链接,原有文件均保持不变。 但是我们想,如果想要删除一些奇怪的特殊名称的文件,使用普通的rm方式却很难删除。本篇围绕这个话题,介绍Linux删除特殊名称的文件有哪些方式可删除。 rm...
  • linux 快速删除大量/大文件

    千次阅读 2020-06-25 00:23:13
    linux 快速删除大量/大文件 1、快速删除大量文件: 假如你要在linux删除大量文件,比如100万、1000万,像/var/spool/clientmqueue/的mail邮件,/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf *可能就...
  • linux删除文件夹及下面所有文件

    万次阅读 2019-06-26 20:20:22
    使用rm -rf 目录名字 命令即可 -r 就是向下递归,不管有多少级目录,一并...将会删除/var/log/httpd/access目录以及其下所有文件、文件夹 删除文件使用实例:rm -f /var/log/httpd/access.log 将会强制删除/var/log...
  • Linux下批量删除文件(大小等于0的文件)的方法find . -name "*" -type f -size 0c | xargs -n 1 rm -f删除指定大小的文件,只要修改对应的 -size 参数find . -name "*" -...
  • Linux防止文件或文件夹被恶意删除

    千次阅读 2020-05-15 09:42:31
    Linux系统中,有个``chattr``命令,可修改文件或文件夹的属性。如果平时有些重要文件需要防止被恶意删除,可使用此命令实现。
  • 如果你们像我一样,在类 Unix 操作系统中,大量多版本的相同文件放在不同的备份目录,你可以使用下面的工具找到并删除重复文件。-- Sk有用的原文链接请访问文末的“原文链...
  • Linux系统中的链接文件

    千次阅读 多人点赞 2019-06-06 20:14:09
    日志文件系统ext xfs里 1.节点区域 记录的都是文件属性,ls -l file ,文件的元数据inode tables 2.数据区域 放的时cat file看到的一切,数据块 cat 找的是数据区域 一个文件对应一个节点号,一个节点号对应一个...
  • Linux上恢复误删除文件或目录

    千次阅读 2020-06-15 14:21:47
    删除Linux系统文件了?不用急,本文将给你一个恢复Linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~ 说在前面的话 针对日常维护操作,难免会出现文件删除的操作。大家熟知Linux文件系统不同...
  • linux删除所有的无效文件链接

    千次阅读 2018-04-24 17:11:07
    一应用系统中留下了非常多的无效链接,使用 shell 脚本删除所有的无效链接for a in `find . -type l` do stat -L $a &gt;/dev/null 2&gt;/dev/null if [$? -gt 0] then rm $a fi done find . –...
  • 使用rm 删除文件原理:rm命令只是把链接解除(unlink),进程仍然可以读取已删除文件,所以并不释放磁盘空间。 解决方法:杀掉进程 sof | grep deleted ,该命令用于查询占用使用rm命令删除文件所占用的进程...
  • Linux删除文件常用的几种措施

    万次阅读 多人点赞 2018-05-14 14:59:55
    LINUX中,经常要删除文件,大多时候使用rm命令就足以应付了,有的时候需要用-f,强制删除,碰到有子目录的时候,需要加-r参数,也就是说,不考虑安全问题,rm -rf filename就可以解决绝大部分问题.先看下rm的一般...
  • Linux中找回误删除文件

    千次阅读 2018-06-24 14:17:00
    Linux中找回误删除文件 作为一个多用户、多任务的Linux操作系统,会出现在没有备份的情况下将一些用户文件误删的情况,Linux下的文件一旦被删除,是难以恢复的。尽管删除命令只是在文件节点中作删除标记,并不...
  • 点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取Linux不像windows有那么显眼的回收站,不是简单的还原就可以了。linux删除文件还原可以分为两种情...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 500,213
精华内容 200,085
关键字:

删除链接文件linux

linux 订阅