Linux文件与目录管理
Posted 放飞梦想C
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文件与目录管理相关的知识,希望对你有一定的参考价值。
目录的相关操作
- . 代表此层目录
- . . 代表上一层目录
- - 代表前一个工作目录
- ~ 代表『目前用户身份』所在的家目录
- ~account 代表 account 这个用户的家目录(account 是个账号名称)
cd:变换目录
- cd [相对路径或绝对路径]
- cd ~ 表示回到自己的家目录
- cd . . 表示去到目前的上层目录
- cd - 表示回到刚刚的那个目录
pwd:显示当前目录
- pwd [-P]
- 选项与参数:
- -P :显示出确实的路径,而非使用链接 (link) 路径。
mkdir:建立一个新的目录
- mkdir [-mp] 目录名称
- 选项与参数:
- -m :配置文件案的权限,直接设定,预设权限 (umask) ;
- -p :帮助你直接将所需要的目录(包含上层目录)递归建立起来;
rmdir:删除一个空的目录
- rmdir [-p] 目录名称
- 选项与参数:
- -p :连同『上层』『空的』目录也一起删除。
文件与目录管理
文件与目录的检视: ls
- ls [-aAdfFhilnrRSt] 文件名或目录名称..
- ls [--color={never,auto,always}] 文件名或目录名称..
- ls [--full-time] 文件名或目录名称..
- 选项与参数:
- -a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
- -A :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
- -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
- -f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)
- -F :根据文件、目录等信息,给予附加数据结构,例如:
- *:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
- -h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
- -i :列出 inode 号码,inode 的意义下一章将会介绍;
- -l :长数据串行出,包含文件的属性与权限等等数据;(常用)
- -n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)
- -r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
- -R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
- -S :以文件容量大小排序,而不是用档名排序;
- -t :依时间排序,而不是用档名。
- --color=never :不要依据文件特性给予颜色显示;
- --color=always :显示颜色
- --color=auto :让系统自行依据设定来判断是否给予颜色
- --full-time :以完整时间模式 (包含年、月、日、时、分) 输出
- --time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time)
cp (复制文件或目录)
- cp [-adfilprsu] 来源文件(source) 目标文件(destination)
- cp [options] source1 source2 source3 .... directory
- 选项与参数:
- -a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)
- -d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
- -f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
- -i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
- -l :进行硬式连结(hard link)的连结档建立,而非复制文件本身;
- -p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
- -r :递归持续复制,用于目录的复制行为;(常用)
- -s :复制成为符号链接文件 (symbolic link),亦即『快捷方式』文件;
- -u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
- --preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
- 最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!
rm (移除文件或目录)
- rm [-fir] 文件或目录
- 选项与参数:
- -f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
- -i :互动模式,在删除前会询问使用者是否动作
- -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!
mv (移动文件与目录,或更名)
- mv (移动文件与目录,或更名)
- mv [-fiu] source destination
- mv [options] source1 source2 source3 .... directory
- 选项与参数:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- -u :若目标文件已经存在,且 source 比较新,才会更新 (update)
文件查阅
cat (concatenate)
- cat [-AbEnTv]
- 选项与参数:
- -A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
- -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
- -E :将结尾的断行字符 $ 显示出来;
- -n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
- -T :将 [tab] 按键以 ^I 显示出来;
- -v :列出一些看不出来的特殊字符。
nl (添加行号打印
- nl [-bnw] 文件
- 选项与参数:
- -b :指定行号指定的方式,主要有两种:
- -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
- -b t :如果有空行,空的那一行不要列出行号(默认值);
- -n :列出行号表示的方法,主要有三种:
- -n ln :行号在屏幕的最左方显示;
- -n rn :行号在自己字段的最右方显示,且不加 0 ;
- -n rz :行号在自己字段的最右方显示,且加 0 ;
- -w :行号字段的占用的字符数。
- -b :指定行号指定的方式,主要有两种:
more (一页一页翻动)
- 空格键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
- f :立刻显示出文件名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less (一页一页翻动)
- 空格键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字符串 :向下搜寻『字符串』的功能;
- ?字符串 :向上搜寻『字符串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- g :前进到这个资料的第一行去;
- G :前进到这个数据的最后一行去 (注意大小写);
- q :离开 less 这个程序;
数据截取
head (取出前面几行)
- head [-n number] 文件
- 选项与参数:
- -n :后面接数字,代表显示几行的意思
tail (取出后面几行)
- tail [-n number] 文件
- 选项与参数:
- -n :后面接数字,代表显示几行的意思
- -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测
非纯文本文件:od
- od [-t TYPE] 文件
- 选项或参数:
- -t :后面可以接各种『类型 (TYPE)』的输出,例如:
- a :利用默认的字符来输出;
- c :使用 ASCII 字符来输出
- d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;
- f[size] :利用浮点数(floating)来输出数据,每个数占用 size bytes ;
- o[size] :利用八进制(octal)来输出数据,每个整数占用 size bytes ;
- x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;
- -t :后面可以接各种『类型 (TYPE)』的输出,例如:
修改文件时间或建置新档:touch
- touch [-acdmt] 文件
- 选项与参数:
- -a :仅修订 access time;
- -c :仅修改文件的时间,若该文件不存在则不建立新文件;
- -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
- -m :仅修改 mtime ;
- -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
文件与目录的默认权限与隐藏权限
文件预设权限:umask
??新的文件或目录时,『目前用户在建立文件或目录时候的权限默认值』。
[root@study ~]# umask
0022 <==与一般权限有关的是后面三个数字!
[root@study ~]# umask -S
u=rwx,g=rx,o=rx
??umask 的分数指的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以,也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,5 分就是读与执行的权限。
chattr (配置文件案隐藏属性)
chattr 指令只能在Ext2/Ext3/Ext4 的 Linux 传统文件系统上面完整生效。
- chattr [+-=][ASacdistu] 文件或目录名称
- 选项与参数:
- + :增加某一个特殊参数,其他原本存在参数则不动。
- - :移除某一个特殊参数,其他原本存在参数则不动。
- = :设定一定,且仅有后面接的参数
- A :当设定了 A 这个属性时,若你有存取此文件(或目录)时,他的访问时间 atime 将不会被修改, 可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
- S :一般文件是异步写入磁盘的(原理请参考 sync 的说明),如果加上 S 这个属性时, 当你进行任何文件的修改,该更动会『同步』写入磁盘中。
- a :当设定 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设定这属性
- c :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩, 但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
- d :当 dump 程序被执行的时候,设定 d 属性将可使该文件(或目录)不会被 dump 备份
- i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』 对于系统安全性有相当大的帮助!只有 root 能设定此属性
- s :当文件设定了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间, 所以如果误删了,完全无法救回来了喔!
- u :与 s 相反的,当使用 u 来配置文件案时,如果该文件被删除了,则数据内容其实还存在磁盘中, 可以使用来救援该文件喔!
- 注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定;
- 注意 2:xfs 文件系统仅支援 AadiS 而已。
lsattr (显示文件隐藏属性)
- lsattr [-adR] 文件或目录
- 选项与参数:
- -a :将隐藏文件的属性也秀出来;
- -d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
- -R :连同子目录的数据也一并列出来!
文件特殊权限: SUID, SGID, SBIT
Set UID 对于文件的特殊功能:
- SUID 权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要具有 x 的可执行权限;
- 本权限仅在执行该程序的过程中有效 (run-time);
- 执行者将具有该程序拥有者 (owner) 的权限。
??SUID 仅可用在 binary program 上, 不能够用在 shell script 上面。
Set GID 对于文件来说的功能:
- SGID 对二进制程序有用;
- 程序执行者对于该程序来说,需具备 x 的权限;
- 执行者在执行的过程中将会获得该程序群组的支持!
Set GID 对于目录来说的功能:
- 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
- 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若用户在此目录下具有 w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此目录的群组相同。
Sticky Bit SBIT 对于目录的作用是
- 当用户对于此目录具有 w, x 权限,亦即具有写入的权限时;
- 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件
SUID/SGID/SBIT 权限设定
- 4 为 SUID
- 2 为 SGID
- 1 为 SBIT
[root@study ~]# cd /tmp
[root@study tmp]# touch test <==建立一个测试用空档
[root@study tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test
# 设定权限成为 -rws--x--x 的模样:
[root@study tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@study tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test
观察文件类型:file
??如果你想要知道某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的信息,就可以利用 file 这个指令来检阅。
指令与文件的搜寻
脚本文件名的搜寻
which (寻找『执行档』)
- which [-a] command
- 选项或参数:
- -a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
文件档名的搜寻
whereis (由一些特定的目录中寻找文件文件名)
- whereis [-bmsu] 文件或目录名
- 选项与参数:
- -l :可以列出 whereis 会去查询的几个主要目录而已;
- -b :只找 binary 格式的文件;
- -m :只找在说明文件 manual 路径下的文件;
- -s :只找 source 来源文件;
- -u :搜寻不在上述三个项目当中的其他特殊文件。
locate / updatedb
-
locate [-ir] keyword
-
选项与参数:
- -i :忽略大小写的差异;
- -c :不输出档名,仅计算找到的文件数量
- -l :仅输出几行的意思,例如输出五行则是 -l 5
- -S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
- -r :后面可接正规表示法的显示方式
-
updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
-
locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。
find
-
find [PATH] [option] [action]
-
选项与参数:
-
与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
- -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
- -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
- -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
- -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
-
选项与参数:
-
与使用者或组名有关的参数:
- -uid n :n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在 /etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。
- -gid n :n 为数字,这个数字是组名的 ID,亦即 GID,这个 GID 记录在 /etc/group
- -user name :name 为使用者账号名称喔!例如 dmtsai
- -group name:name 为组名喔,例如 users ;
- -nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
- -nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件! 当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。
-
选项与参数:
-
与文件权限及名称有关的参数:
- -name filename:搜寻文件名为 filename 的文件;
- -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
- c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是『 -size +50k 』
- -type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。
- -perm mode :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
- -perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744, 当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
- -perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻
- -rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------
也会被列出来,因为他有 -rw.... 的属性存在!
-
选项与参数:
-
额外可进行的动作:
- -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
- -print :将结果打印到屏幕上,这个动作是预设动作!
- +4 代表大于等于 5 天前的檔名:ex> find /var -mtime +4
- -4 代表小于等于 4 天内的文件档名:ex> find /var -mtime -4
- 4 则是代表 4-5 那一天的文件档名:ex> find /var -mtime 4
??find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
- {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
- -exec 一直到 ; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是『 ls -l {} 』啰!
- 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠 来跳脱。
重点回顾
- 绝对路径:『一定由根目录 / 写起』;相对路径:『不由 / 写起,而是由相对当前目录写起』
- 特殊目录有:., . ., -, ~, ~account 需要注意;
- 与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
- rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
- 用户能使用的指令是依据 PATH 变量所规定的目录去搜寻的;
- ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
- 文件的复制、删除、移动可以分别使用:cp, rm , mv 等指令来操作;
- 检查文件的内容(读文件)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
- cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
- touch 的目的在修改文件的时间参数,但亦可用来建立空文件;
- 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls默认显示的是 mtime。
- 除了传统的 rwx 权限之外,在 Ext2/Ext3/Ext4/xfs 文件系统中,还可以使用 chattr 与 lsattr 设定及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
- 新建文件/目录时,新文件的预设权限使用 umask 来规范。默认目录完全权限为 drwxrwxrwx, 文件则为
-rw-rw-rw-。 - 文件具有 SUID 的特殊权限时,代表当用户执行此一 binary 程序时,在执行过程中用户会暂时具有程序拥有者的权限
- 目录具有 SGID 的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同。
- 目录具有 SBIT 的特殊权限时,代表在该目录下用户建立的文件只有自己与 root 能够删除!
- 观察文件的类型可以使用 file 指令来观察;
- 搜寻指令的完整文件名可用 which 或 type ,这两个指令都是透过 PATH 变量来搜寻文件名;
- 搜寻文件的完整档名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实际搜寻文件系统;
- 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。
以上是关于Linux文件与目录管理的主要内容,如果未能解决你的问题,请参考以下文章