当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 文件操作

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:36

的存储空间,建议用 stat 命令查看它们之间的区别,包括它们的 Blocks,inode 等值,也可以考虑用 diff 比较它们的大小。$ ls regular_file*ls regular_file* -l-rw-r--r-- 2 root root 204800 2007-12-07 22:30 regular_file-rw-r--r-- 2 root root 204800 2007-12-07 22:30 regular_file_hard_linklrwxrwxrwx 1 root root 12 2007-12-07 20:15 regular_file_soft_link -> regular_file$ rm regular_file # 删除原文件$ cat regular_file_hard_link # 硬链接还在,而且里头的内容还有呢fefe$ cat regular_file_soft_linkcat: regular_file_soft_link: No such file or directory虽然软链接文件本身还在,不过因为它本身不存储内容,所以读不到东西,这就是软链接和硬链接的区别。需要注意的是,硬链接不可以跨文件系统,而软链接则可以。另外,也不允许给目录创建硬链接。范例:普通文件再分类文件类型从 Linux 文件系统那么一个级别分了以上那么多类型,不过普通文件还是可以再分的(根据文件内容的”数据结构“分),比如常见的文本文件,可执行的 ELF 文件,odt 文档,jpg 图片格式,swap 分区文件,pdf 文件。除了文本文件外,它们大多是二进制文件,有特定的结构,因此需要有专门的工具来创建和编辑它们。关于各类文件的格式,可以参考相关文档标准。不过非常值得深入了解 Linux 下可执行的 ELF 文件的工作原理,如果有兴趣,建议阅读一下参考资料中和 ELF 文件相关部分,这一部分对于嵌入式 Linux 工程师至关重要。虽然各类普通文件都有专属的操作工具,但是还是可以直接读、写它们,这里先提到这么几个工具,回头讨论细节。od :以八进制或者其他格式“导出”文件内容。strings :读出文件中的字符(可打印的字符)gcc,gdb,readelf,objdump等:ELF文件分析、处理工具(gcc编译器、gdb调试器、readelf分析 ELF 文件,objdump` 反编译工具)再补充一个非常重要的命令,file,这个命令用来查看各类文件的属性。和 stat 命令相比,它可以进一步识别普通文件,即 stat 命令显示的 regular file 。因为 regular file 可以有各种不同的结构,因此在操作系统的支持下得到不同的解释,执行不同的动作。虽然,Linux 下,文件也会加上特定的后缀以便用户能够方便地识别文件的类型,但是 Linux 操作系统根据文件头识别各类文件,而不是文件后缀,这样在解释相应的文件时就更不容易出错。下面简单介绍 file 命令的用法。$ file ././: directory$ file /etc/profile/etc/profile: ASCII English text$ file /lib/libc-2.5.so/lib/libc-2.5.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped$ file /bin/test/bin/test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped$ file /dev/hda/dev/hda: block special (3/0)$ file /dev/console/dev/console: character special (5/1)$ cp /etc/profile .$ tar zcf profile.tar.gz profile$ file profile.tar.gzprofile.tar.gz: gzip compressed data, from Unix, last modified: Tue Jan 4 18:53:53 2000$ mkfifo fifo_test$ file fifo_testfifo_test: fifo (named pipe)更多用法见 file 命令的手册,关于 file 命令的实现原理,请参考 magic 的手册(看看 /etc/file/magic 文件,了解什么是文件的 magic number 等)。文件属主Linux 作为一个多用户系统,为多用户使用同一个系统提供了极大的方便,比如对于系统上的文件,它通过属主来区分不同的用户,以便分配它们对不同文件的操作权限。为了更方便地管理,文件属主包括该文件所属用户,以及该文件所属的用户组,因为用户可以属于多个组。先来简单介绍 Linux 下用户和组的管理。Linux 下提供了一组命令用于管理用户和组,比如用于创建用户的 useradd 和 groupadd,用于删除用户的 userdel 和 groupdel,另外,passwd 命令用于修改用户密码。当然,Linux 还提供了两个相应的配置,即 /etc/passwd 和 /etc/group,另外,有些系统还把密码单独放到了配置文件 /etc/shadow 中。关于它们的详细用法请参考后面的资料,这里不再介绍,仅介绍文件和用户之间的一些关系。范例:修改文件的属主$ chown 用户名:组名 文件名如果要递归地修改某个目录下所有文件的属主,可以添加 -R 选项。从本节开头列出的文件结构体中,可以看到仅仅有用户 ID 和组 ID 的信息,但 ls -l 的结果却显示了用户名和组名信息,这个是怎么实现的呢?下面先看看 -n 的结果:范例:查看文件的属主$ ls -n regular_file-rw-r--r-- 1 0 0 115 2007-12-07 23:45 regular_file$ ls -l regular_file-rw-r--r-- 1 root root 115 2007-12-07 23:45 regular_file范例:分析文件属主实现的背后原理可以看到,ls -n 显示了用户 ID 和组 ID,而 ls -l 显示了它们的名字。还记得上面提到的两个配置文件 /etc/passwd 和 /etc/group 文件么?它们分别存放了用户 ID 和用户名,组 ID 和组名的对应关系,因此很容易想到 ls -l 命令在实现时是如何通过文件结构体的 ID 信息找到它们对应的名字信息的。如果想对 ls -l 命令的实现有更进一步的了解,可以用 strace 跟踪看看它是否读取了这两个配置文件。$ strace -f -o strace.log ls -l regular_file$ cat strace.log | egrep "passwd|group|shadow"2989 open("/etc/passwd", O_RDONLY) = 32989 open("/etc/group", O_RDONLY) = 3说明: strace 可以用来跟踪系统调用和信号。如同 gdb 等其他强大的工具一样,它基于系统的 ptrace 系统调用实现。实际上,把属主和权限分开介绍不太好,因为只有它们两者结合才使得多用户系统成为可能,否则无法隔离不同用户对某个文件的操作,所以下面来介绍文件操作权限。文件权限从 ls -l 命令的结果的第一列的后 9 个字符中,可以看到类似这样的信息 rwxr-xr-x,它们对应于文件结构体的 st_mode 部分(st_mode 包含文件类型信息和文件权限信息两部分)。这类信息可以分成三部分,即 rwx,r-x,r-x,分别对应该文件所属用户、所属组、其他组对该文件的操作权限,如果有 rwx 中任何一个表示可读、可写、可执行,如果为 - 表示没有这个权限。对应地,

上一页  [1] [2] [3] [4] [5]  下一页


Shell 文件操作