精华内容
下载资源
问答
  • Linuxpwd命令

    2017-01-18 22:35:54
    说明:pwd主要是来查看当前工作目录的完整路径 一般情况下,pwd后面是不带任何参数的下面我来说说有点特殊的情况: pwd -P(显示的是实际路径,而pwd显示的是连接...如当前目录删除了,而用pwd命令任然会显示那个目录

    说明:pwd主要是来查看当前工作目录的完整路径
    一般情况下,pwd后面是不带任何参数的

    下面我来说说有点特殊的情况:

    1. pwd -P(显示的是实际路径,而pwd显示的是连接路径)
    2. /bin/pwd -L(目录连接链接时,输出连接路径)或 -P(表示输出物理路径)
    3. 如当前目录删除了,而用pwd命令任然会显示那个目录
    展开全文
  • C语言实现linux pwd命令

    千次阅读 2017-04-08 17:23:36
    参考资料通过实现Linuxpwd命令,以理解Linux文件系统的基本概念一集内部实现,并熟悉Linux系统与文件系统相关的系统调用接口。 引自实验楼课程 [C语言实现linux pwd命令] 侵删 知识点: 列表内容 Linux pwd命令 ...

    实验内容

    通过实现Linux的pwd命令,以理解Linux文件系统的基本概念一集内部实现,并熟悉Linux系统与文件系统相关的系统调用接口。

    引自实验楼课程 [C语言实现linux pwd命令] 侵删


    知识点:

    • 列表内容
    • Linux pwd命令
    • Linux文件系统中文件及目录的实现方式
    • Linux文件及目录系统调用接口的使用

    pwd命令

    pwd命令的用处是输出当前工作目录的绝对路径,可以不带任何参数直接使用。

    1.0版本的pwd

    /*
     * 文件名: mypwd1.c
     * 描述:通过系统函数getcwd实现pwd命令
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(void)
    {   
        char buf[1024];
    
        char *cwd =getcwd(buf, sizeof(buf));
    
        if (NULL == cwd) {
            perror("Get cerrent working directory fail.\n");
            exit(-1);
        } else {
            printf("Current working directory is : %s\n", cwd);
        }
    
        return 0;
    }

    虽然这段代码实现了pwd的功能,但是却依然无法为我们解答pwd是如何工作的。

    要了解pwd是如何工作的,我们还必须先了解Linux中对于文件目录的组织方式开始。

    Linux中的文件

    在Linux中的文件系统中,文件=N(N>=1)个inode+M(M>=1)个数据块

    数据块,存放文件的内容数据,数据块的数目根据文件内容大小而定。

    inode成为信息节点,有两个作用:

    1. 存储根文件线管的属性信息,如修改时间、所有者、文件类型和文件长度,并没有文件名
    2. 存储指向文件内容数据块的指针信息。

    在一个文件系统中,一个inode代表一个文件,并使用一个整数值来表示该inode,成为inode-number,该值对于一个文件系统而言是唯一的,即通过该值可以找到其对应的inode。一般情况下,一个文件只有一个inode信息来描述它。

    下面通过一段程序来获取某个文件的inode信息:

    *  文件名:filestat.c
    *  描述:打印指定文件名的inode信息
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    struct stat file_stat;
    
    void print_file_stat(struct stat *fs)
    {
        printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
        printf("inode: \t\t\t\t%ld\n", fs->st_ino);
        printf("protection: \t\t\t%o\n", fs->st_mode);
        printf("number of hard links: \t\t%lu\n", fs->st_nlink);
        printf("user ID of owner: \t\t%d\n", fs->st_uid);
        printf("group ID of owner: \t\t%d\n", fs->st_gid);
        printf("file size in bytes: \t\t%ld\n", fs->st_size);
        printf("time of last access: \t\t%s", ctime(&fs->st_atime));
        printf("time of last modification: \t%s", ctime(&fs->st_mtime));
        printf("time of last change: \t\t%s", ctime(&fs->st_ctime));
    }   
    
    int main(int argc, char* argv[])
    {   
    
        if (2 != argc) {
            fprintf(stderr, "Usage: %s filename...\n", argv[0]);
            exit(-1);
        }
    
        if (0 != stat(argv[1], &file_stat)) {
            perror("stat"); 
            exit(-1);
        }
    
        print_file_stat(&file_stat);
    
        return 0;
    }

    Linux中的目录

    在Linux系统中,文件系统通过目录“包含”子目录及文件的方式,来组织成一个树状结构。那么目录是如何“包含”其他目录及文件的呢?

    目录,在Linux中,其实也是一种文件,所以它也是由“inode+数据块”构成的。而气温件内容是一个列表,每一个列表记录“inode-number+filename”。

    因此,我们通常所说的目录a“包含”文件b,其实现层面上的意思是,目录a的内容列表里有一个关于文件b的列表项,即“b的inode-number+b的filename”。

    综上,Linux中,一个文件(包括目录)的文件名,及文件名与inode的对应关系,都是由包含该文件的目录所描述的。

    下面的例子,掩饰了如何打印指定目录的内容列表:

    /*
    * 文件名:directorylist.c
    * 描述:打印指定目录的内容列表
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/types.h>
    
    int main(int argc, char *argv[])
    {
        if (2 != argc) {
            fprintf(stderr, "Usage: %s directory...\n", argv[0]);
            exit(-1);
        }
    
        DIR *dp = NULL;
        struct dirent *dptr = NULL;
        if (NULL == (dp = opendir(argv[1]))) {
            fprintf(stderr, "Can not open Input Directory [%s]\n", argv[1]);
            exit(-1);
        } else {
            printf("Directory [%s] Content List: \n", argv[1]);
            while (NULL != (dptr = readdir(dp))) {
                printf("inode-number: %-10ld \t filename: %s\n", dptr->d_ino, dptr->d_name);
            }
    
            closedir(dp);
        }
    
        return 0;
    }

    实现pwd命令

    实现思路:
    1. 通过特殊的文件名”.”获取当前目录的inode-number(假设当前目录为a)
    2. 通过特殊的文件名”..”获取当前目录的父级目录的inode-number
    3. 判断当前目录和上级目录的inode-number是否一样
    4. 如果两个inode-number一样说明达到根目录,输出完整路径,退出程序
    5. 如果两个inode-number不一样,切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来,然后重新回到步骤1

    实现代码:

    /*
    * 文件名:mypwd.c
    * 描述:实现简单的pwd命令
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <string.h>
    #include <unistd.h>
    
    /*根据文件名获取文件inode-number*/
    ino_t get_ino_byname(char *filename)
    {
        struct stat file_stat;
        if (0 != stat(filename, &file_stat)) {
            perror("stat");
            exit(-1);
        }
        return file_stat.st_ino;
    }
    
    /*根据inode-number ,在当前目录中查找对应的文件名*/
    char* find_name_byino(ino_t ino)
    {
        DIR *dp = NULL;
        struct dirent *dptr = NULL;
        char *filename = NULL;
        if (NULL == (dp = opendir("."))) {
            fprintf(stderr, "Can not open Current Directory\n");
            exit(-1);
        } else {
            while (NULL != (dptr = readdir(dp))) {
                if (dptr->d_ino == ino) {
                    filename = strdup(dptr->d_name);
                    break;
                }
            }
            closedir(dp);
        }
        return filename;
    }
    
    /*限制最大的目录深度*/
    #define MAX_DIR_DEPTH (256)
    
    int main(int argc, char *argv[])
    {
        /*记录目录名的栈*/
        char *dir_stack[MAX_DIR_DEPTH];
        unsigned current_depth = 0;
    
        for(;;) {
            /*1.通过特殊的文件名“.”获取当前目录的inode-number*/
            ino_t current_ino = get_ino_byname(".");
            /*2.通过特殊的文件名“..”获取当前目录的父级目录的inode-number*/
            ino_t parent_ino = get_ino_byname("..");
    
            /*3.判断当前目录和上级目录的inode-number是否一样*/
            if (current_ino == parent_ino)
                break; /*4.如果两个inode-number一样说明到达根目录*/
    
            /*5.如果两个inode-number不一样*/
            /*切换至父级目录,根据步骤1获取的inode-number,在父级目录中搜索对应的文件名并记录下来, 重新回到步骤1*/
            chdir("..");
            dir_stack[current_depth++] = find_name_byino(current_ino);
            if (current_depth>=MAX_DIR_DEPTH) { /*路径名太深*/
                 fprintf(stderr, "Directory tree is too deep.\n");
                 exit(-1);
            }
        }
    
        /*输出完整路径名*/
        int i = current_depth-1;
        for (i = current_depth-1; i>=0; i--) {
           fprintf(stdout, "/%s", dir_stack[i]);
        }
        fprintf(stdout, "%s\n", current_depth==0?"/":"");
    
        return 0;
    }

    参考资料

    《Unix环境高级编程》

    展开全文
  • linux pwd命令详解

    2015-07-27 19:30:47
    在Linux层次结构,用户可以被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录。想要知道当前所处的目录,可以用pwd...
    在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名。
    全称
    Print Working Directory
    用途
    显示工作目录的路径名称。
    语法
    pwd [ -L | -P ]
    描述
    pwd 命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用 /(斜线)分隔。第一个 / 表示根目录,最后一个目录是当前目录。
    标志
    -L
    如果 PWD 环境变量包含了不包含文件名 .(点)或 ..(点点)的当前目录的 绝对路径名,则显示 PWD 环境变量的值。否则,-L 标志与 -P 标志一样运行。
    -P
    显示当前目录的绝对路径名。与 -P 标志一起显示的绝对路径不包含在路径名的绝对路径中涉及到 符号链接类型的文件的名称。
    退出状态
    该命令返回以下出口值:
    0 成功完成。
    >0 发生错误
    展开全文
  • 0x00 pwd命令是什么? pwd用来显示到达当前目录的路径。 0x01 pwd命令是如何工作的? 我们知道一个目录下包含了两个特殊的目录.和..分别表示当前目录和上一个目录。我们可以先找到.的inode节点编号,然后回到上一级...

    0x00 pwd命令是什么?

    pwd用来显示到达当前目录的路径。

    0x01 pwd命令是如何工作的?

    我们知道一个目录下包含了两个特殊的目录...分别表示当前目录和上一个目录。我们可以先找到.inode节点编号,然后回到上一级目录,通过inode节点编号获取该目录的名字。

    什么时候递归结束呢?当然是到达目录树的顶端了。当到达树的顶端的时候,...inode编号相同。

    0x02 使用函数介绍

    我们这里的操作主要有

    0x0201 目录打开

    所需要的头文件

    #include <sys/types.h>
    #include <dirent.h>
    

    函数的格式

    DIR *opendir(const char *name);
    

    name指向我们需要打开的目录,返回的是一个DIR结构体指针(可以理解为“目录描述符”)。

    0x0202 目录的读操作

    所需要的头文件

    #include <dirent.h>
    

    函数的格式

    struct dirent *readdir(DIR *dirp);
    

    dirp指向我们的目录描述符,返回的是一个dirent结构体。

    struct dirent {
        ino_t          d_ino;       /* Inode number */
        off_t          d_off;       /* Not an offset; see below */
        unsigned short d_reclen;    /* Length of this record */
        unsigned char  d_type;      /* Type of file; not supported
                                                  by all filesystem types */
        char           d_name[256]; /* Null-terminated filename */
    };
    

    我们可以通过d_name获取目录中的文件信息。

    0x0203 目录的关闭操作

    所需的头文件

    #include <sys/types.h>
    #include <dirent.h>
    

    函数原型

    int closedir(DIR *dirp);
    

    dirp指向我们的目录描述符,关闭的过程中出现错误返回-1

    0x0204 获取文件信息

    所需的头文件

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    

    函数原型

    int stat(const char *pathname, struct stat *statbuf);
    

    pathname指向我们需要获取的文件,stat是一个结构体包含文件信息。

    struct stat {
        dev_t     st_dev;         /* ID of device containing file */
        ino_t     st_ino;         /* Inode number */
        mode_t    st_mode;        /* File type and mode */
        nlink_t   st_nlink;       /* Number of hard links */
        uid_t     st_uid;         /* User ID of owner */
        gid_t     st_gid;         /* Group ID of owner */
        dev_t     st_rdev;        /* Device ID (if special file) */
        off_t     st_size;        /* Total size, in bytes */
        blksize_t st_blksize;     /* Block size for filesystem I/O */
        blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */
    
        /* Since Linux 2.6, the kernel supports nanosecond
                      precision for the following timestamp fields.
                      For the details before Linux 2.6, see NOTES. */
    
        struct timespec st_atim;  /* Time of last access */
        struct timespec st_mtim;  /* Time of last modification */
        struct timespec st_ctim;  /* Time of last status change */
    
    #define st_atime st_atim.tv_sec      /* Backward compatibility */
    #define st_mtime st_mtim.tv_sec
    #define st_ctime st_ctim.tv_sec
    };
    

    获取信息出错的话返回-1

    0x0205 改变目录位置

    所需的头文件

    #include <unistd.h>
    

    函数原型

    int chdir(const char *path);
    

    path指向我们需要改变的目录位置。

    0x03 编写一个pwd

    0x0301 第一版

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <string.h>
    #include <unistd.h>
    
    void printpathto(ino_t);
    void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen);
    ino_t get_inode(char *filename);
    
    void printpathto(ino_t this_inode)
    {
        ino_t my_inode;
        char its_name[BUFSIZ];
        if (get_inode("..") != this_inode)
        {
            chdir("..");
            inum_to_name(this_inode, its_name, BUFSIZ);
            my_inode = get_inode(".");
            printpathto(my_inode);
            printf("/%s", its_name);
        }
    }
    
    void inum_to_name(ino_t inode_to_find, char *namebuf, int buflen)
    {
        DIR *dir_ptr;
        struct dirent *direntp;
        dir_ptr = opendir(".");
        if (dir_ptr == NULL)
        {
            perror(".");
            exit(1);
        }
    
        while ((direntp = readdir(dir_ptr)) != NULL)
        {
            if (direntp->d_ino == inode_to_find)
            {
                strncpy(namebuf, direntp->d_name, buflen);
                namebuf[buflen - 1] = '\0';
                closedir(dir_ptr);
                return;
            }
        }    
        fprintf(stderr, "error looking for inum %ld\n", inode_to_find);
        exit(1);
    }
    
    ino_t get_inode(char *filename)
    {
        struct stat info;
        if (stat(filename, &info) == -1)
        {
            fprintf(stderr, "Cannot stat");
            perror(filename);
            exit(1);
        }
        return info.st_ino;
    }
    int main()
    {
        printpathto(get_inode("."));
        putchar('\n');
        return 0;
    }
    

    我们查看我们的版本和实际版本的区别

    功能实现的还不错,但是我们没有递归到home目录。是代码问题吗?不是,因为unix允许一个磁盘的存储由多棵树构成,每个磁盘或磁盘上的每个分区都包含一颗目录树。

    我将该问题的其他语言版本添加到了我的GitHub Linux

    如有问题,希望大家指出!!!

    展开全文
  • 由于 Linux 文件系统有许多目录,当用户执行一条 Linux 命令又没有指定该命令或参数所在的目录时,Linux 系统就会首先当前目录(目前的工作目录)搜寻这个命令或它的参数。因此,用户执行命令之前,常常需要...
  • Linux中用 pwd 命令来查看”当前工作目录“的完整路径。 简单得说,每当你终端进行操作时,你都会有一个当前工作目录。不太确定当前位置时,就会使用pwd来判定当前目录文件系统内的确切位置
  • pwd命令用来显示到达当前目录的路径。 /*以下代码opensuse11下编译通过 结构体dirent保存目录的详细信息 struct dirent { ino_t d_ino; /* inode number */ off_t d_off; /* offset to the next ...
  • pwd命令以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用/分隔。第一个/表示根目录,最后一个目录是当前目录。执行pwd命令可立刻得知您目前所在的工作目录...
  • pwd命令  pwd命令用来以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用/分隔。第一个/表示根目录,最后一个目录是当前目录。执行pwd命令可立刻得知您...
  • Linux命令pwd

    2012-08-06 14:50:16
    pwd命令用于显示当前工作目录,是Linux下最常用的命令之一。不太确定当前位置时,就会使用pwd来判定当前目录文件系统内的确切位置。环境变量OLDPWD表示前一次的工作目录,环境变量PWD表示当前的工作目录。 常用...
  • pwd 查看当前目录的路径 pwd
  • pwd命令

    2014-04-11 12:27:34
    在Linux层次结构,用户可以被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录。想要知道当前所处的目录,可以用pwd...
  • Linux 命令(文件和目录管理 - pwd

    千次阅读 2016-09-27 14:32:55
    Linux 层次结构,想要知道当前所处的目录,可以用 pwd 命令,该命令输出当前工作目录的完整名称。环境变量 OLDPWD 表示前一次的工作目录,环境变量 PWD 表示当前的工作目录。简述 pwd 常用选项 用法pwd 命令...
  • Linux系统之Pwd和cd命令

    2020-02-20 19:06:20
    Linux系统之Pwd和cd命令 ...2、pwd作用:实际工作,我们经常会不同目录之间进行切换,为了防止“迷路”,我们可以使用pwd命令快速查看当前我们所在的目录路径。 3、cd命令: 这个命令应该是Linux中用的最频繁...
  • linux pwd

    2017-05-15 08:09:29
    pwd命令以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用/分隔。第一个/表示根目录,最后一个目录是当前目录。执行pwd命令可立刻得知您目前所在的工作目录...
  • pwd命令 显示当前路径

    2021-01-09 19:24:53
    实际工作,我们经常会不同目录之间进行切换,为了防止“迷路”,我们可以使用pwd命令快速查看当前我们所在的目录路径。 语法格式: pwd [参数] 常用参数: -L 显示逻辑路径 参考实例 查看当前工作目录...
  • 每天一条linux命令 学习-- cd和pwd命令

    千次阅读 2016-08-26 08:45:48
    今天学的cd命令 其实不用学 语法和DOS基本一样,参数方面 .表示当前目录,../表示上级目录 ~表示当前用户根目录,/表示系统根目录 学了一个新参数 !...pwd命令是显示当前目录的完整路径 一并学习了。
  • Linux常用基本命令

    万次阅读 多人点赞 2020-11-21 00:07:04
    Linux常用基本命令 目录文件管理 cd 切换目录 cd 绝对路径/相对路径 切换目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd / 进入根目录 ls 列出目录 ls 列出文件(不包括隐藏...
  • 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留系统内存。内部命令是写...
  • 每天一个linux命令pwd 更多精彩请关注:www.zicreate.com 1.命令功能 pwd 即 Print Working Directory,显示当前工作目录。不太确定当前位置时,就会使用pwd来判定当前目录文件系统内的确切位置。...
  • Linux基础cd、pwd和ls命令

    千次阅读 2018-11-07 22:27:33
    cd命令 cd命令是change directory的缩写,中文翻译:更改文件夹(目录)。 cd destination cd命令可接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指定目标路径,它将切换到...pwd命令 pwd命
  • 为方便马哥学员的理解和使用,马哥linux运维团队特别做了《马哥Linux命令大全锦集》,命令是集合了马哥教育学员工作使用的Linux常用命令,由马哥创始团队加工精制而成。 本期为《马哥Linux命令大全锦集》01期,...
  • Linux中tar命令

    万次阅读 多人点赞 2018-01-25 16:34:41
    tar命令是类Linux中比价常用的解压与压缩命令。 可以使用命令 (man tar) 命令来进行查看man的基本命令。下面举例说明一下tar 的基本命令。 #tar -cvf sysconfig.tar /etc/sysconfig ...(可以使用pwd命令
  • Linux常用命令

    万次阅读 多人点赞 2018-11-08 11:49:23
    一、基本命令 1.1 关机和重启 1.2 帮助命令 二、目录操作命令 2.1 目录切换 cd 2.2 目录查看 ls [-al] 2.3 目录操作【增,删,改,查】 2.3.1创建目录【增】 mkdir 2.3.2删除目录或文件【删】rm 2.3.3目录...
  • Linux系统,文件、文件名次、命令字等均对大小写敏感,注意 以当前目录为起点,表示相对路径 相对路径使用点号‘.’表示当前目录,两个点号‘..’表示当前目录的上一级目录 cd 命令将改变当前的工作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,697
精华内容 30,278
关键字:

在linux中pwd命令表示

linux 订阅