Linux系统中的所有文件存储在文件系统中,它们被组织到一个颠倒的目录树中,称为文件系统层次结构。这棵树是颠倒的,因为树根在该层次结构的顶部,树根的下方延伸出目录和子目录的分支。
注意:
在描述文件系统目录内容时会遇到下列术语:
静态:保持不变的内容,除非以显式方式编辑或重新配置。
动态或可变:通常由活动进程修改或附加的内容。
永久:在重启后依然保留的内容,尤其是配置设置。
运行时:重启期间清除的进程或系统特定内容或属性。
重要的RHEL目录:
位置用途/usr安装的软件、共享的库,包括文件和静态只读程序数据。重要的子目录有:/usr/bin(用户命令),/usr/sbin(系统管理命令),/usr/local(本地自定义软件)。/etc特定于此系统的配置文件。/var特定于此系统的可变数据,在系统启动之间保持永久性。动态变化的文件(如数据库、缓存目录、日志文件、打印机后台处理文档和网站内容)可以在/var下找到。/run自上一次系统启动以来启动的进程的运行时数据。只包括进程ID文件和锁定文件,等等。此目录中的内容在重启时重新创建。(此目录整合了旧版RHEL中的/var/run和/var/lock)/home普通用户存储其个人数据和配置文件的主目录。/root管理超级用户root的主目录。/tmp供临时文件使用的全局可写空间。10天内未访问、未更改或未修改的文件将自动从该目录中删除。还有一个临时目录/var/tmp,该目录中的文件如果在30天内未访问、未更改或未修改,将被自动删除。/boot开始启动过程所需的文件。/dev包含特殊的设备文件,供系统用于访问硬件。重要:
在RHEL7中,/中的四个较旧的目录现在与它们在/usr中对应的目录拥有完全相同的内容:
/bin和/usr/bin。/sbin和/usr/sbin。/lib和/usr/lib。/lib64和/usr/lib64。在RHEL的较早版本中,这些是不同的目录,包含几组不同的文件。在RHEL7中,/中的目录是/usr中对应目录的符号链接。详细说明可见man 7 hier。
文件或目录的路径指定其唯一的文件系统位置。跟随文件路径会遍历一个或多个指定的子目录,用正斜杠/分隔,直到到达目标位置。与其他文件类型相同,标准的文件行为定义也适用于目录(也称为文件夹)。
重要:
虽然空格字符在Linux文件名称中可以接受,但空格是命令shell用于命令语法解译的分隔符。建议新手管理员避免在文件名中使用空格,因为包含空格的文件名常常导致意外的命令执行行为。
绝对路径:
绝对路径是完全限定名称(FQN),自根目录(/)开始,指定到达且唯一代表单个文件所遍历的每个子目录。文件系统中的每个文件都有一个唯一绝对路径名,可通过一个简单的规则识别:第一个字符是正斜杠(/)的路径名是绝对路径名。绝对路径名可能会太长而不方便键入,所以文件也可通过相对路径查找。
相对路径:
与绝对路径一样,相对路径也标识唯一文件,仅指定从工作目录到达该文件所需的路径。识别相对路径名遵循一个简单规则:第一个字符是正斜杠(/)之外的其他字符的路径名是相对路径名。
对于标准的Linux文件系统,文件路径名长度(包含所有/字符)不可超过4095字节。路径名中通过/字符隔开的每一部分长度不可超过255字节。文件名可以使用任何UTF-8编码的Unicode字符,但/和NUL字符除外。(ASCII字符需要一个字节;其他拉丁语、希腊语、希伯来语或斯拉夫语字符占用两个字节;Unicode基本多语文平面中的其他字符占用三个字节,不存在占用字节超过四个的字符。)
Linux文件系统,包含但不限于ext4、XFS、BTRFS、GFS2和GlusterFS,都是区分大小写的。在同一目录中创建FileCase.txt和filecase.txt将生成两个不同的文件。虽然Linux中支持许多非Linux文件系统,每一种系统都具有独特的文件命名规则。然而,VFAT以及NTFS和HFS+具有大小写保留行为。虽然这些文件系统不区分大小写(主要的目的是支持向后兼容性),它们的确是用文件创建时的原始大小写形式显示文件名。
pwd命令显示当前位置的完整路径名,这有助于决定使用相对路径名到达文件所需的相应语法。
ls命令列出指定目录的目录内容;如果未指定目录,则列出当前目录的内容。
cd命令可更改目录。cd -命令可将目录更改到用户在进入当前目录之前所处的目录。cd ..命令使用..隐藏目录上移一个级别,进入其父目录,而不必知道确切的父目录名称。另一个隐藏目录(.)可为当前位置是来源或目标参数的命令指定当前目录,以此免除键入目录绝对路径名的必要。
为简明起见,shell程序提示符仅显示当前目录路径的最后一个部分。在任何时候,都可通过cd来返回到用户的主目录。无需指定目标位置。用户的当前目录是其主目录时,提示符显示波形符(~)字符。
参考:
info libc 'file name resolution'
touch命令通常可将文件的时间戳更新为当前的日期和时间,而不做其他修改。这通常可用于创建空文件(可供练习使用),因为“触摸”不存在的文件名会导致创建该文件。
ls命令具有多个选项,用于显示文件的属性。最常见且最有用的选项是-l(长列表格式)、-a(包含隐藏文件在内的所有文件),以及-R(递归方式,包含所有子目录的内容)。
列表顶部的两个特殊目录是当前目录(.)和父目录(..)。这些特殊目录存在于系统中的每一目录。
重要:
开头为.的文件名表示隐藏文件,在使用ls和其他命令的普通视图中不可见。这不是一种安全功能。隐藏文件用于防止必要的用户配置文件让主目录凌乱不堪。许多命令仅通过特定的命令行选项处理隐藏文件,这样可以预防一个用户的配置被意外复制到其他目录或其他用户。
要防止文件内容被不当查看,需要使用文件权限。
文件管理涉及创建、删除、复制和移动文件和目录。
文件管理命令
活动单来源多来源复制文件cp file1 file2cp file1 file2 file3 dir^5^移动文件mv file1 file2^1^mv file1 file2 file3 dir^4^删除文件rm file1rm -f file1 file2 file3^5^创建目录mkdir dirmkdir -p par1/par2/dir^6^复制目录cp -r dir1 dir2^2^cp -r dir1 dir2 dir3 dir4^4^移动目录mv dir1 dir2^3^mv dir1 dir2 dir3 dir4^4^删除目录rm -r dir1^2^rm -rf dir1 dir2 dir3^5^注释:
结果为重命名。需要使用“递归”选项处理来源目录。如果dir2存在,则结果为移动。如果dir2不存在,则结果为重命名。最后一个参数必须是目录。请谨慎使用-f选项,系统将不会提示您确认操作。使用-p选项时应小心,无法捕获键入错误。创建目录
mkdir命令创建一个或多个目录或子目录;如果文件名已经存在,或者尝试在不存在的父目录中创建目录,将生成错误。-p父级选项将为请求的目标位置创建缺失的父目录。使用mkdir -p时应小心,因为意外拼写错误将创建不需要的目录,而不会生成错误消息。
复制文件
cp命令复制一个或多个文件,成为新的独立文件。其语法允许将一个现有文件复制为当前或另一目录中的一个新文件,或者将多个文件复制到另一目录中。在任何目标位置上,新文件名都必须唯一。如果新文件名不唯一,那么复制命令将覆盖现有文件。
在通过一个命令复制多个文件时,最后一个参数必须为目录。复制的文件在新的目录中保留其原有名称。目标位置上存在的冲突文件名可能会被覆盖。为防止用户意外覆盖带有内容的目录,多文件cp命令将忽略指定为来源的目录。复制带有内容的非空目录要求使用-r递归选项。
移动文件
mv命令在同一目录中重命名文件,或者将文件重新放到新的目录中。文件内容保持不变。将文件移动到另一文件系统要求通过复制源文件创建新的文件,然后再删除源文件。尽管通常对用户透明,但移动大型文件所需的时间可能会明显较长。
同cp命令,目标位置上存在的冲突文件名可能会被覆盖。
删除文件和目录
rm的默认语法将删除文件,而不是目录。要删除目录以及其下可能存在的许多子目录和文件,需要使用-r递归选项。没有命令行取消删除功能,也没有可从中恢复的垃圾箱。如果使用-i,则将以交互方式提示每个删除操作。这基本上与-f是相反的,后者将强制进行删除而不会提示用户。
rmdir命令仅删除空的目录。删除的目录无法取消删除。
Bash shell具有一个路径名匹配功能,以前叫做通配(globbing),缩写自早期的UNIX的“全局命令”(global command)文件路径扩展程序。Bash通配功能通常称为模式匹配或“通配符”,可以使管理大量文件变得更加轻松。使用“扩展”的元字符来匹配要寻找的文件名和路径名,可以一次性针对集中的一组文件执行命令。
匹配模式
通配是一种shell命令解析操作,它将一个通配符模式扩展到一组匹配的路径名。在执行命令之前,命令行元字符由匹配列表替换。不返回匹配项的模式(尤其是方括号扩起的字符类),将原始模式请求显示为字面上的文本。下列为常见的元字符和模式类。
模式匹配项*由0个或以上字符组成的任何字符串。?任何一个字符。~当前用户的主目录。~usernameusername用户的主目录。~+当前工作目录。~-上一工作目录。[abc...]括起的类中的任何一个字符。[!abc...]不在括起的类中的任何一个字符。[^abc...]不在括起的类中的任何一个字符。[[:alpha:]]任何字母字符。^1^[[:lower:]]任何小写字符。^1^[[:upper:]]任何大写字符。^1^[[:alnum:]]任何字母字符或数字。^1^[[:punct:]]除空格和字母数字以外的任何可打印字符。^1^[[:digit:]]任何数字,即0-9。^1^[[:space:]]任何一个空白字符;可能包含制表符、换行符、或回车符,以及换页符和空格。^1^注释:
预设的POSIX字符类;针对当前区域而调整。波形符扩展
波形符(~)后接斜杠分隔符时可匹配当前用户的主目录。当后接一个字符串直到斜杠时,如果可找到匹配项,则它被解释为用户名。如果找不到匹配的用户名,则返回实际波形符加上该字符串。
大括号扩展
大括号扩展用于生成任意字符串。大括号包含字符串的逗号分隔列表或顺序表达式(逗号分隔列表:{str1,str2,strN};顺序表达式{x..y[..incr]})。结果包含大括号定义之前或之后的文本。大括号扩展可以相互嵌套。注意,逗号分隔列表中,逗号前后均不能有空格!
命令替换
命令替换允许命令的输出替换命令本身。当命令包含前导美元符号和括号$(COMMAND)或者反引号时,就会发生命令替换。反引号形式比较陈旧,而且有两个缺点:①反引号在视觉上很容易与单引号混淆;②反引号无法嵌套在反引号内。$(COMMAND)形式可以互相嵌套多个命令扩展。
防止参数被扩展
在Bash shell中,许多字符有特殊含义。为了忽略元字符的特殊含义,使用引用和转义来防止它们被shell扩展。反斜杠(\)是Bash中的一个转义字符,防止其后的一个字符被特殊解释。如果要保护较长的字符串,则使用单引号(')或双引号(")来括起字符串。
使用双引号可以阻止通配和shell扩展,但依然允许命令和变量替换。变量替换在概念上与命令替换一样,但可能使用可选的大括号语法。
使用单引号则可以按字面解译所有的文本。在屏幕和键盘上观察单引号(’)和命令替换反引号(`)的区别。除了阻止通配和shell扩展外,单引号也指示shell额外阻止命令替换和变量替换。问号也是一个需要防止扩展的元字符。