小柒

linux文件操作
2.1文件种类正规文件(regular file):纯文本档,二进制文件,数据格式文件目录(directory)[...
扫描右侧二维码阅读全文
28
2019/05

linux文件操作

2.1文件种类

  • 正规文件(regular file):纯文本档,二进制文件,数据格式文件
  • 目录(directory)[d]:drwxr-x---
  • 链接文件(link)[l]:lrwxr-x---
  • 设备与装置文件(device):区块设备文件[b],字符设备文件[c]
  • 资源接口文件(sockets)[s]
  • 数据输送文件(FILO pipe)[p]
文件长度:单一文件目录可以容纳255bytes,英文可容纳255个字符,中文可以容纳128个中文字
可分享的(shareable)不可分享的(unshareable)
不变的(static)/usr (软件放置处) /opt (第三方协力软件)/etc (配置文件) /boot (开机与核心档)
可变动的(variable)/var/mail (使用者邮件信箱) /var/spool/news (新闻组)/var/run (程序相关) /var/lock (程序相关)

2.2绝对路径与相对路径

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;
  • 相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正开头不是 /

就属于相对路径的写法

cd /var/log (absolute) 
cd ../var/log (relative)
  • . :代表当前的目录,也可以使用 ./ 来表示;
  • .. :代表上一层目录,也可以 ../ 来代表。
  • - :代表前一个工作目录
  • ~ "代表『目前用户身份』所在的家目录
  • ~account :代表 account 这个用户的家目录(account 是个账号名称)

2.3三大目录

  • / (root, 根目录):与开机系统有关;
  • /usr (unix software resource):与软件安装/执行有关;
  • /var (variable):与系统运作过程有关。
FHS目录规则详见鸟哥linux私房菜第4版p225

2.4目录结构图

EKkFUg.md.jpg

2.5目录的操作

cd:变换目录
pwd:显示当前目录
pwd -P:显示确实的路径

mkdir:建立一个新的目录
mkdir -m 764 dirname 创建一个目录且赋值权限为rwxrw-r--
mkdir -p dir/dir2/dirname 递归建立上层没有的目录

rmdir:删除一个空的目录
rmdir -p 递归删除上一层空目录

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)


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 [-fir] 文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)

#取文件目录和文件名
basename /etc/sysconfig/network 取文件名
dirname /etc/sysconfig/network 取文件目录

2.6查看文件

cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符

#反向输出
tac /etc/issue

#行号输出
nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。

#翻页输出
more /etc/man_db.conf
空格键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less /etx/man_db.conf
 空格键 :向下翻动一页;
 [pagedown]:向下翻动一页;
 [pageup] :向上翻动一页;
 /字符串 :向下搜寻『字符串』的功能;
 ?字符串 :向上搜寻『字符串』的功能;
 n :重复前一个搜寻 (与 / 或 ? 有关!)
 N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
 g :前进到这个资料的第一行去;
 G :前进到这个数据的最后一行去 (注意大小写);
 q :离开 less 这个程序;


#取前几行 
head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思

tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测

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 ;
 

2.7文件时间

  • modification time (mtime):

当该文件的『内容数据』变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或
权限喔!

  • status time (ctime):

当该文件的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新
这个时间啊。

  • access time (atime):

当『该文件的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取
/etc/man_db.conf , 就会更新该文件的 atime 了。

#查看ctime atime mtime
date; ls -l /etc/man_db.conf ; ls -l --time=atime /etc/man_db.conf ;  ls -l --time=ctime /etc/man_db.conf

#修改时间
touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不建立新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

#新建空文件
[root@study ~]# touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不建立新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
范例一:新建一个空的文件并观察时间
[dmtsai@study ~]# cd /tmp
[dmtsai@study tmp]# touch testtouch
[dmtsai@study tmp]# ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch
# 注意到,这个文件的大小是 0 呢!在预设的状态下,如果 touch 后面有接文件,
# 则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在,
# 则会主动的建立一个新的空的文件喔!例如上面这个例子!

2.8文件/目录默认权限与隐藏权限

2.8.1文本预设权限

[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 分。

建立文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
建立目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x

2.8.2文件隐藏属性

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称
chattr +i attrtest #使用示例
chattr -i attrtest #使用示例
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
_ :移除某一个特殊参数,其他原本存在参数则不动。
= :设定一定,且仅有后面接的参数
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 而已

2.8.3显示文件隐藏属性

[root@study ~]# lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名; -R :连同子目录的数据也一并列出来!
[root@study tmp]# chattr +aiS attrtest
[root@study tmp]# lsattr attrtest 
--S-ia---------- attrtest

2.9文件特殊权限(SUID.SGID,SBIT)

#SetUID
 SUID 权限仅对二进制程序(binary program)有效;
 执行者对于该程序需要具有 x 的可执行权限;
 本权限仅在执行该程序的过程中有效 (run-time);
 执行者将具有该程序拥有者 (owner) 的权限。

1. dmtsai 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 dmtsai 能执行 passwd; 2. passwd 的拥有者是 root 这个账号;
3. dmtsai 执行 passwd 的过程中,会『暂时』获得 root 的权限;
4. /etc/shadow 就可以被 dmtsai 所执行的 passwd 所修改。

#SetGID
当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID
 SGID 对二进制程序有用;
 程序执行者对于该程序来说,需具备 x 的权限;
 执行者在执行的过程中将会获得该程序群组的支持!

 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
 用途:若用户在此目录下具有 w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此
目录的群组相同。

#StickyBit
这个 Sticky Bit, SBIT 目前只针对目录有效,对于文件已经没有效果.
1. 以 root 登入系统,并且进入 /tmp 当中;
2. touch test,并且更改 test 权限成为 777 ; 3. 以一般使用者登入,并进入 /tmp;
4. 尝试删除 test 这个文件!

2.9.1SUID/SGID/SBIT设置

  • 4 为 SUID
  • 2 为 SGID
  • 1 为 SBIT
假设要将一个文件权限改为『-rwsr-xr-x』时,由于 s 在用户权力中,所以是 SUID ,因此, 在原 先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!
touch test
chmod 4775 test;ls -l test
-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
最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t 都 是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可执行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!
#符号法增减
# 设定权限成为 -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

2.10查看文件类型

[root@study ~]# file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本档啊!
[root@study ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically 
linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
# 执行文件的数据可就多的不得了!包括这个文件的 suid 权限、兼容于 Intel x86-64 等级的硬件平台 # 使用的是 Linux 核心 2.6.32 的动态函式库链接等等。

[root@study ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 这是 data 文件!
最后修改:2019 年 05 月 29 日 08 : 20 AM

发表评论