linux学习笔记——filesystem

filesystem 569


文件是任意源,有有一个名称,可以从中读取数据;或者是任意目标,有一个名称,可以向其中写入数据。术语“文件”不仅指磁盘文件,还可以指任意的物理设备
unix文件有三类:普通文件、目录文件、伪文件
在伪文件中,有三种最为常见:特殊文件、命名管道、proc文件
普通文件或者常规文件是大多数人在使用单词“文件”时所指的文件。普通文件包含数据,位于某种类型的存储设备上,有两种类型:文本文件和二进制文件
目录文件包含unix用来定位所需的信息,它们用来组织、访问其他文件
伪文件并不用来存储数据,它们本身不占用任何空间。大多数情况下,伪文件用来访问内核提供的服务
最重要的伪文件类型是特殊文件,有时候也成为设备文件
有两种类型的伪设备文件:/dev/null和/dev/zero,写入到这两种设备中的任何输出都会被抛弃,所以有时候称这些文件是”位桶(bit bucket)“
两者的区别在输出上。当程序从/dev/null中读取数据时,不管请求输入多少字节,结果总是eof;当程序从/dev/zero中读取数据时,文件生成和请求一样多的字符,都是值0,可以认为是null字符。
命名管道:FIFO,是一种用来创建具有名字的管道设施的伪文件。创建命名管道用mkfifo程序,语法为:
mkfifo [-m mode] pipe
其中mode是chmod程序使用的一种文件模式类型,pipe是希望创建的管道的名称


将小型文件系统连接到主文件系统的特定目录上时,称为挂载(mount)该文件系统,主树上的特定目录称为挂载点。当断开文件系统时,称为卸载(umount)文件系统,命令是mount和unmount。对于没有挂载在其他位置的固定介质来说,指定目录是/mnt,对于可移动介质来说,目录是/media
在目录中移动:cd(change directory)、pwd(print working directory)
语法:cd [-LP] [directory | -] 
其中directory是希望切换到的目录的名称,默认切换到home目录
创建新目录:mkdir,语法为:
mkdir [-p] directory ...
其中directory是希望创建的目录的名称
-p(make parent创建父目录)选项:如果父目录不存在,将自动创建父目录
创建目录时需要遵循的两个规则:
1.不能创建两个相同的树枝
2.不能创建一个没有长在树上的新树枝
移除目录:rmdir,语法为:
rmdir [-p] directory
移除目录时,也要遵循两条规则:
1.只有当一个目录为空的时候,才能移除这个目录
2.不能删除根目录和工作目录之间的任何目录
-p(delete parent删除父目录)选项:自动移除所有需要移除的父目录
如果希望移除非空的目录,可以移除带有-r选项的rm命令
移动或重命名目录:mv,语法为:
mv directory target
其中directory是希望移动或重命名的目录,target是目标或新名称
如果新位置和原位置在同一个目录中,那么实际结果就是对原始目录重命名


使用目录栈:pushd、popd、dirs
shell提供了一个类似栈的功能来存放目录名称,在任何时候都可以使用pushd命令将目录的名称压入目录栈(directory stack)中,然后使用popd命令从战中弹出一个目录名称,此外,随时可以使用dirs命令显示栈的内容。语法为:
pushd [directory | +n]
popd [+n]
dirs [-c] [-l] [-v]
其中directory是目录的名称,n是标识符。当dirs使用选项时,选项必须单独指定,不能连在一起。
命令 动作
dirs 显示名称:home目录显示为~
dirs -l 显示名称:home目录显示为完整路径名
dirs -v 显示名称:每行一个,并且有数字标识符
pushd directory 改变工作目录:将directory压入栈中
push +n 改变工作目录:将目录#n移到栈顶
popd 改变工作目录:弹出栈顶
popd +n 从栈中移除目录#n
dirs -c 除当前工作目录外,移除栈中的全部目录


列举目录内容:ls -CrR1
为了显示有关目录内容的信息,可以使用ls(list files)程序,语法为:
ls [-aCdFglrRs1] [name...]
其中name是目录或文件的名称
ls程序的默认行为是按字母表顺序显示目录中各文件的名称
当通过管道传输时,ls的输出是单行的列,如果希望以列的形式输出,必须加上-C选项
-r选项:以相反的顺序显示文件名
-R(recursive)选项:列举指定目录中所有直接或简洁的子目录和文件的信息,即是说显示整个目录树的信息
-F(flag,标识)选项:列举文件时在特定类型文件的名称之后显示一个标识:
标识 含义
普通文件:非执行文件
* 普通文件:可执行文件
/ 目录
@ 符号链接
| 命名管道/FIFO


检查文件类型:file,语法为:
file [name...]
掌握磁盘空间使用情况:ls -hs、du、df、quota
ls -s(size):在每个文件名前面以KB为单位列出文件的大小
ls -h(human-readable,适合人类阅读):以适合阅读的方式列出
du(disk usage,磁盘使用):可以用来显示文件的大小,语法为:
du [-achs] [name...]
其中name是目录或文件的名称
-s(sum,总和)选项:只显示总和
-h选项:以适合人类阅读的方式显示
-c(count)选项:在输出末尾显示总量;通常-csh连着使用
-a(all)选项:显示所处理的每个目录和文件的大小
还有一个磁盘存储统计程序是df(disk free-space,即磁盘可用空间),这个程序显示每个文件系统已经使用了多少磁盘空间,以及还有多少磁盘空间可用
df -h:将以适合人类阅读的方式输出


查看文件块大小的命令:dumpe2fs
必须在超级用于权限下运行


ls -l使用的文件类型指示符:
指示符 含义
- 普通文件
d 目录
l 符号链接
b 特殊文件(块设备)
c 特殊文件(字符设备)
p 命名管道(FIFO)


显示目录树:tree(很奇怪,在我的系统中无法使用,可能未安装)


创建文件:touch
touch的主要目的就是在不改变文件的情况下改变文件的修改时间和访问时间,就如果伸手轻轻地触摸文件一样(其名称就是这样得来的)。语法为:
touch [-acm] [-t time] file...
其中time是时间和日期,格式为[[YY]YY]MMDDhhmm[.ss]
默认情况下,touch同时将修改时间和访问时间设置为当前时间和日期。
-m选项:只改变修改时间
-a(access)选项:只改变访问时间
-c(no create,不创建)选项:如果文件不存在,将不创建文件
-t选项:指定某一个时间


复制文件:cp
该命令的语法为:
cp [-ip] file1 file2
其中file1是已有文件的名称,file2是目标文件的名称
-i(interactive)选项:在替换已有文件之前进行询问
-p(preserve,保持)选项:使目标文件和源文件拥有相同的修改时间和访问时间以及权限
cp命令还可以用来将一个或多个文件复制到不同的目录中。语法为:
cp [ip] file... directory
其中file是已有文件的名称,directory是已有目录的名称,-ip选项和上面相同
通过使用-r选项,可以让cp将目录以及其所有文件复制到另一个目录中,语法为:
cp -r [-ip] directory1... directory2
其中directory1是已有目录的名称,directory2是目标目录的名称。-r表是递归


移动文件:mv
要将文件移动到不同的目录中,可以使用mv(move)命令,语法为:
mv [-if] file... directory
其中file是已有文件的名称,directory是目标目录的名称
如果directory不存在,则mv将重命名该文件
-i(interancive)选项:如果已存在目标文件,则在替换已有文件前询问
-f(force)选项:强制替换,忽略-i选项以及文件权限


删除文件:rm
为了删除文件,需要使用rm(remove)命令,语法为:
rm [-fir] file...
其中file是希望删除的文件的名称
-i(interactive)选项:删除前询问
-f(force)选项:强制删除,忽略权限提示
-r(recursive)选项:删除整个目录树


文件权限
unix为每个文件维护一组文件权限(file permission),通常称为权限。权限有3种,包括:读(read)权限、写(write)权限和执行(execute)权限
对于普通文件来说,权限的定义相当直接:
读权限允许用户标识读取该文件
写权限允许用于标识写入该文件
执行权限允许用户执行该文件
对于目录而言,目录的权限和普通文件有所不同:
读权限允许用户标识读取目录中的文件名
写权限允许用户标识修改目录(创建、移动、复制、删除)条目
执行权限允许用户标识搜索目录


每个文件有3组权限:一组针对属主、一组针对组、一组针对其他用户
每当运行程序时,该程序将在你的用户标识的权限下运行
setuid权限:允许普通的用户标识以特殊的权限运行程序,就像他们是文件的属主一样,可以简写为suid(set user id)
当拥有suid权限时,ls -l文件权限列表中的字母x被字母s取代
显示用户标识和用户组标识的最简单方式是用id命令
组标识的列表存放在:etc/group
组的名称存放在口令文件:/etc/passwd
每个用户标识可以属于不同的组,另一种显示所有组的方式是使用groups程序,语法为:groups [userid...]
在使用ls -l列举文件的时候,几个文件指示符的含义如下:
r=读权限
w=写权限
x=执行权限
-=没有权限
unix使用一个紧凑的3位数字的代码来表示一个完整的文件权限集,该代码称为文件模式(file mode),或简称为模式(mode)
文件模式中各种权限的数字值:
4=读权限
2=写权限
1=执行权限
0=没有权限
对于每一组权限来说,只需将适当的数字加在一起
例如:777或者540
改变文件的权限时,需要使用chmod(change file mode)命令。语法为:
chmod mode file...
其中mode是新文件模式,file是文件或目录的名称


当unix创建新文件时,将根据文件的类型为文件指定下述几种模式:
666:不可执行的普通文件
777:可执行的普通文件
777:目录
在这一初始模式上,unix再减去用户掩码(user mask)值。用户掩码是一种模式,由自己设置,表明希望限制的权限,设置用户掩码需要用umask命令,语法为:
umask [mode]
其中mode指定希望限制的权限
最好将umask命令放在登录文件中,以便每次登录时都可以自动地设置用户掩码


清空文件内容:shred
shred程序的目的是多次覆盖硬盘上的已有数据,清除硬盘磁面的痕迹,使已删除过的数据难以恢复,并填充随机数据,语法为:
shred fvuz [file...]
-v(verbose,详细)选项:在处理过程中显示处理消息
-z选项:结束任务时将文件填充为0
-u选项:处理之后删除文件
-f选项:忽略受限制的文件权限


链接的概念:stat、ls -i
当unix创建文件时,unix完成两件事情。第一,unix在存储设备上保留一块空间用来存储数据;第二,unix创建一个称为索引节点(index node)或者i节点(i-node)的结构,来存放文件的基本信息。i节点包含使用文件所需的全部文件系统的信息。
在Linux中,可以通过使用stat命令,查看某个特定文件的i节点内容,语法为:
stat filename
文件系统将所有的i节点存放在一个表中,称为i节点表(inode table),在i节点表中,每个i节点由索引号(index number)或者i节点号(i-number)表示
文件名和i节点之间的连接称为链接
一个文件可以拥有不止一个名称,因为多个名称都可以链接到该文件的i节点


ln命令可以创建新链接,语法为:
ln file newname
其中file是一个已有的普通文件的名称,newname是希望赋予链接的名称
第二种使用ln的方式就是为一个或多个普通文件创建新链接,并将新链接放在指定的目录中,语法为:
ln file... directory
其中file是已有普通文件的名称,,directory是希望放置新链接的目录的名称
这样的链接有两个限制:1.不能为目录创建链接。2.不能为不同文件系统中的文件创建链接
在创建不同文件系统中的目录或者文件的链接时,需要创建符号链接(symbol link或者symlink)。这样做时,需要使用带-s选项的ln命令。符号链接包含的不是文件的i节点号,而是原文件的路径名。符号链接类似于win的快捷键
对于cd命令,有两个选项:
-L(logical)选项:将符号链接视为真实的目录。这是cd默认的选项
-P(physical)选项:用真实目录替换符号链接
pwd命令也有类似的选项
whereis程序用来查看于特定unix命令相关的文件:二进制文件、源文件和文档文件
whereis程序的语法为:
whereis [-bms] command...
-b(binary)选项:只显示可执行文件路径名
-m(manual)选项:只显示联机手册文件路径名
-s(source)选项:只显示源文件


通过搜索数据库查找文件:locate
locate程序的任务就是搜索一个特殊的数据库(该数据库中包含所有可公共访问的文件的路径名),查找所有包含特定模式的路径名。该数据库自动维护。语法为:
locate [-bcirS] pattern...
其中pattern是在路径名中查找的模式
-r(re)选项:模式中使用正则表达式
-c(count)选项:显示匹配文件的总数,而不显示实际的文件名
-i(ignorecase)选项:忽略字母大小写
-b(basename)选项:匹配路径名的最后一部分


通过搜索目录树查找文件:find
find是最古老、最复杂的unix程序之一,用来进行完全的搜索,语法为:
find path... test... action...
path就是路径,说明find从何处开始进行搜索
test是测试,指定标准。
下面是一些重要的测试:


文件名
-name pattern 包含pattern的文件名
-iname pattern 包含pattern的文件名(不区分大小写)
文件特征
-type [df] 文件类型:d=目录,f=普通文件
-mode 设置为mode的文件权限
-user userid 属主为userid
-group groupid 组为groupid
-size [-+]n[cbkMG] 大小为n[字符(字节)、块、千字节、兆字节、吉字节]
-empty 空文件(大小=0)
访问时间、修改时间
-amin [-+]n n分钟之前访问
-anewer file file文件之后访问
-atime [-+]]n n天之前访问
-cmin [-+]n n分钟之前状态改变
-cnewer file file文件之后状态改变
-ctime [-+]n n天之前状态改变
-mmin [-+n] n分钟之前修改
-mtime [-+]n n天之前修改
-newer file file文件之后修改


上面的-表示小于,+表示大于指定的n


-type测试控制find查找哪些文件类型,相应的语法为-type的后面跟一个单字母的标识。大多时候,或者使用f代表普通文件,或者使用d代表目录。如果需要,还可以是所有b(块设备)、c(字符设备)、p(命名管道)或l(符号链接)
-name测试告诉find查找其文件名匹配的文件。如果使用通配符,需要将其引用
find命令可以在测试前面加一个!运算符对测试求反。这样做时,需要遵循两条规则:1.必须在!号两边各留一个空格。2.必须引用!,这样!才可以传递给find。例如:
find ~ -type f '!' -name '*.jpg' -print


action就是对查找到的文件执行的动作:
动作
-print 将路径名写入到标准输出
-fprint file 同-print:将输出写入到file中
-ls 显示长目录列表
-fls file 同-ls:将输出写入到file中
-delete 删除文件
-exec command {} \; 执行command,{}指示匹配的文件名
-ok command {}\; 同-exec,但是在运行command前进行确认


字符{}表示find查找到的路径名
-exec将为每个搜索到的文件执行command


处理查找到的文件:xargs
xargs(X-args)可以运行任何使用参数指定的命令,参数通过标准输入传递给该程序。可以替代find中的-exec,程序的语法为:
xargs [-prt] [-istring] [command [argument...]]
其中command是希望运行的命令的名称,string是占位符,argument是从标准输入读取的参数


-i(insert)选项:使用{}作为占位符
-istring选项:使用指定的string作为占位符
占位符将在命令运行之前被参数取代
如:find . -type f | xargs -iXX mv XX XX.old
-p(prompt)选项:在命令生成时,显示每条命令,在运行命令之前请求许可
-t(tell)选项:在命令运行过程中显示每条命令
-r选项:如果没有输入参数,则不运行命令
展开阅读全文

没有更多推荐了,返回首页