第7章 Linux文件与目录管理

目录与路径

特殊目录

.:此层目录

..:上层目录

~:目前用户身份所在的主文件夹

~account:account用户所在的主文件夹

 处理目录的命令

cd:切换目录

change directory的缩写

pwd:显示目前所在目录

-P:显示当前路径,而非连接路径

mkdir:新建新目录

-m:配置文件的权限,而非使用默认权限(umask)

-p:递归创建

mkdir创建目录时,要求存在父目录,否则报错,因此可以使用-p参数,此时父目录不存在时会创建父目录

rmdir:删除空的目录

-p:连同上层空目录一起删除

执行文件路径的变量:$PATH

通过指令echo $PATH可以查看变量PATH中设置的目录:

[root@localhost 桌面]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

文件与目录管理

查看文件与目录:ls

-a:全部文件,包括隐藏文件(.开头的文件)

-d:仅列出目录本身,而不列出目录内的文件数据

-l:列出长数据串,包括属性和权限

复制、删除和移动:cp,rm,mv

cp:复制文件或目录

cp [options] source1 source2 .. directory

-a:相当于-pdr

-d:若源文件为连接文件的属性,则复制连接文件的属性而非文件本身

-i:若目标文件存在,则覆盖时先询问操作

-l:进行硬连接的连接文件创建,而非复制文件本身

-p:连同文件的属性一同复制,而不用默认属性(备份)

-r:递归连续复制(用于目录的复制)

-s:复制成为符号连接文件,即快捷方式

不同身份执行cp,区别很大

举例:

转到tmp目录,执行:

[root@localhost ~]# cd /tmp
[root@localhost tmp]# cp /var/log/wtmp .
将/var/log/wtmp复制到当前文件夹,查看源文件和目标文件的属性:

[root@localhost tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 63744 6月  28 11:17 /var/log/wtmp
-rw-r--r--. 1 root root 63744 6月  28 12:28 wtmp
以上可以看出,源文件和目标文件的权限和修改时间都变了

 

若要复制的文件和源文件一模一样,可以使用-a参数:

[root@localhost tmp]# cp -ai /var/log/wtmp .
cp: overwrite ‘./wtmp’? y
[root@localhost tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 63744 6月  28 11:17 /var/log/wtmp
-rw-rw-r--. 1 root utmp 63744 6月  28 11:17 wtmp
以上可以看出,两个文件一模一样。

cp指令的源文件和目标文件在同一个目录,并且文件名不一样时,相当于重命名。

rm:移除文件或目录

-f:强制,忽略不存在的文件

-i:互动模式,删前询问

-r:递归删除

mv:移动目录或更名

-f:强制,若目标存在,直接覆盖而不询问

-i:目标存在,则询问

-u:目标存在且较新才覆盖

rename:重命名

rename   被替换的字符串   被替换成的字符串   匹配要替换的文件模式

举例:

创建四个文件:foo1,foo2,foo11,foo12

[root@localhost tmp]# touch foo1 foo2 foo11 foo12
[root@localhost tmp]# ls -a foo*
foo1  foo11  foo12  foo2


使用rename更改文件名:

[root@localhost tmp]# rename foo foo0 foo?
[root@localhost tmp]# ls -a foo*
foo01  foo02  foo11  foo12
“foo?”表示匹配以foo开头的后面仅有一个字符的文件名,并将这些文件的文件名中的foo替换成foo0

 

相似地,有以下:

[root@localhost tmp]# ls -a foo*
foo1  foo11  foo12  foo2
[root@localhost tmp]# rename foo foo0 foo??
[root@localhost tmp]# ls -a foo*
foo011  foo012  foo1  foo2

以及:

[root@localhost tmp]# ls -a foo*
foo1  foo11  foo12  foo2
[root@localhost tmp]# rename foo foo0 foo*
[root@localhost tmp]# ls -a foo*
foo01  foo011  foo012  foo02

以上举例只适用于red hat系统(如Centos),对于Ubuntu,则需要使用perl表达式:

匹配:m/<regexp>;/
替换:s/<pattern>;/<replacement>;/
转化:tr/<pattern>;/<replacemnt>;

举例:

wuchao@wuchao-Lenovo:~/work$ ls
dir1  foo1  foo11  foo12  foo2
wuchao@wuchao-Lenovo:~/work$ rename 's/foo/file/' foo*
wuchao@wuchao-Lenovo:~/work$ ls
dir1  file1  file11  file12  file2

wuchao@wuchao-Lenovo:~/work$ ls
dir1  file1  file11  file12  file2
wuchao@wuchao-Lenovo:~/work$ rename 'tr/a-z/A-Z/' file*
wuchao@wuchao-Lenovo:~/work$ ls
dir1  FILE1  FILE11  FILE12  FILE2

文件内容查阅

cat:由第一行显示文件内容

[root@localhost ~]# cat -n /etc/issue
     1    S
     2    Kernel 
 on an m
     3    

tac:从最后一行显示文件内容

[root@localhost ~]# tac /etc/issue

Kernel 
 on an m
S

nl:显示的时候,顺便输出行号

[root@localhost ~]# nl /etc/issue
     1    S
     2    Kernel 
 on an m

仅仅显示非空行,若要显示空行,添加 -b a参数

more:一页一页的显示

只能向后翻动

less:与more相似,可以翻页

可以向前翻页,也可以向后翻页

空格:向下翻页

PageDown:下翻一页

PageUp:上翻一页

/字符串:向下查询字符串

?字符串:向上查询字符串

n:重复前一个查询

N:反向重复前一个查询

q:退出

head:只看头几行

-n number:当number为正数时,表示取前面number行显示,当number为负数时,表示取前几行,直到number行(不包括)

tail:只看结尾几行

-n number: 表示取最后number行显示,当number表示为+number时,表示从number行开始显示

-f:检测文件,当有数据写入就会显示出来,直到ctr+c退出该指令

od:以二进制的方式读取文件内容

 

当文件是非文本时,使用该指令

-t type:type如下:

a:默认类的字符输出

c:ascii字符输出

d[size]:利用十进制输出数据,每个整数占用size bytes

f[size]:利用浮点数输出数据,每个整数占用size bytes

o[size]:利用八进制输出数据,每个整数占用size bytes

x[size]:利用十六进制输出数据,每个整数占用size bytes

修改文件时间或创建新文件:touch

首先先了解文件的三个参数:

modification time(mtime):当文件内容改变,更新这个时间

status time(ctime):当文件状态(比如权限和属性)改变,更新该时间

access time(atime):文件的内容被取用时,更新这个时间

举例如下:

//创建新文件
[root@localhost ~]# touch /tmp/test.txt
//查看最后读取时间 [root@localhost
~]# ls -l --time=atime /tmp/test.txt -rw-r--r--. 1 root root 0 6月 28 19:22 /tmp/test.txt
//查看最后状态更改时间 [root@localhost
~]# ls -l --time=ctime /tmp/test.txt -rw-r--r--. 1 root root 0 6月 28 19:22 /tmp/test.txt [root@localhost ~]#
//读取文件 [root@localhost
~]# cat /tmp/test.txt
//查看最后读取时间 [root@localhost
~]# ls -l --time=atime /tmp/test.txt -rw-r--r--. 1 root root 0 6月 28 19:23 /tmp/test.txt [root@localhost ~]#
//更改文件权限 [root@localhost
~]# chmod u=rwx,go=r /tmp/test.txt
//查看最后状态更改时间 [root@localhost
~]# ls -l --time=ctime /tmp/test.txt -rwxr--r--. 1 root root 0 6月 28 19:23 /tmp/test.txt

touch [-acdmt] 文件

-a:仅修改访问时间atime

-c:仅修改文件的时间,文件不存在不创建新的

-t:后面可以接想要修改的日期,格式为 YYYYMMDDhhmm

-m:仅修改mtime

 举例:

[root@localhost ~]# touch  -t 201302031103 /tmp/test.txt
[root@localhost ~]# ls -l /tmp/test.txt
-rwxr--r--. 1 root root 0 2月   3 2013 /tmp/test.txt

 文件与目录的默认权限和隐藏权限

文件默认权限:umask

首先创建文件或目录时,有如下默认权限:

创建文件:-rw-rw-rw-          文件默认记录数据的,故默认是没有执行权限的

创建目录:drwxrwxrwx

接着用刚刚创建的文件或目录的默认权限减去umask的权限,查看umask:

[root@localhost ~]# umask
0022

第一个数字表示是特殊权限,后三个数字表示用户、用户组和其他人的权限:022表示--- -w- -w-

减去该权限得:

创建文件:-rw-rw-rw-   减   ---- -w- -w-   =    -rw- -r- -r--

创建目录:drwxrwxrwx  减  ---- -w- -w-   =   drwx r-x r-x

更改umask值

[root@localhost ~]# umask 0022

文件隐藏属性

chattr:设置文件的隐藏属性

chattr [+-=] [ASacdistu] 文件或目录名

参数:

+:增加某一个特殊参数,其他原本参数不动

-:删除某一个特殊参数,其他原本参数不动

=:仅有后面的参数

 

A:访问文件或目录时,不改变atime属性

S:文件的修改同步写入磁盘(默认异步写入)

a:这个文件只能增加数据,不能删除和修改数据,root才能设置该属性

c:自动压缩文件,读取时自动解压缩

i:让文件不能被删除、改名、写入和添加数据

s:文件删除后,完全从硬盘空间删除

u:文件删除后还可以找回

举例:

[root@localhost tmp]# touch attrtest
//添加i属性 [root@localhost tmp]#
chattr +i attrtest
//尝试删除该文件 [root@localhost tmp]#
rm attrtest rm: remove regular empty file ‘attrtest’? y
//即使root也无法删除该文件
rm: cannot remove ‘attrtest’: Operation not permitted
//移除i属性 [root@localhost tmp]#
chattr -i attrtest [root@localhost tmp]# rm attrtest rm: remove regular empty file ‘attrtest’? y

lsattr:显示文件隐藏属性

-a:隐藏文件的属性也显示出来

-d:如果时目录,仅列出目录本身的属性而非目录内的文件名

-R:连同子目录的数据也列出来

文件的特殊权限:SUID,SGID,SBIT

SUID

当s出现在文件所有者的x权限上,称为Set UID,简称SUID的特殊权限。具有以下功能:

  • SUID仅对二进制程序有效
  • 执行者对于该程序具有x的权限
  • 本权限仅在执行该程序的过程有效
  • 执行者将具有该程序所有者的权限

举例:

所有账户密码都存在/etc/shadow内,该文件仅有root可读且仅有root可以强制写入,但普通用户却可以通过passwd指令更改自己的用户密码,这是为什么?

  1. wuchao用户对于/usr/bin/passwd这个程序具有x权限,即可以执行passwd,并且具有特殊权限SUID
  2. passwd的拥有着是root
  3. wuchao执行passwd时会暂时获得root的权限
  4. /etc/shadow可以被passwd所更改

因此,一般用户可以修改自己在shadow内的密码,尽管用户对该文件没有访问权限。

SGID

当s出现在用户组的x上,称为Set GID,SGID

对于文件而言:

  1. SGID对二进制程序有用
  2. 程序执行者对于该程序来说,需具备x属性
  3. 执行者在执行的过程中将会获得该程序用户组的支持

对目录而言:

  1. 用户若对此目录具有r和x的权限,该用户能够进入此目录
  2. 用户在此目录下的有效用户组将会变为该目录的用户组
  3. 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同

SBIT

Sticky Bit,第三组的x权限变为t。只针对目录有效。

    1. 当用户对于此目录具有w,x权限,即具有写入的权限时
    2. 当用户在该目录创建文件或目录时,仅有自己与root才有权力删除该文件

 举例:

用户甲对于A目录具有用户组或其他人身份,并且对于该目录具有w权限,这表示用户甲对该目录内任何其他人创建的文件都可以删除、重命名和移动。如果将目录A设置SBIT权限,则用户甲只能对自己创建的文件和哦目录进行删除、重命名和移动操作。

设置特殊权限

4表示SUID

2表示SGID

1表所SBIT

chmod 4755 filename 表示文件权限为:-rwsr-xr-x

查看文件类型

file filename

命令与文件的查询

脚本文件名的查询

which(寻找执行文件)

which [-a] command

-a:列出所有有PATH目录中可以找到的命令

[wuchao@localhost tmp]$ which ifconfig
/usr/sbin/ifconfig
[wuchao@localhost tmp]$ which cd
/usr/bin/cd

注意:which是根据PATH变量来寻找执行文件的

 文件名的查找

whereis(寻找特定文件)

whereis [-bmsu] 文件名或目录名

-b:二进制文件

-m:只找在说明文件manual路径下的文件

-s:只找source源文件

-u:查找上述三项以外的其他文件

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

locate

locate 文件名

注意:whereis和locate查找的是系统数据库,故速度很快,但系统数据库每天更新一次,因此和实际硬盘可能不同步。需要输入updatedb指令更新数据库。

find

find   [PATH]   [option]   [action]

参数:

1.与时间有关的参数

-mtime,-ctime,-atime

以-mtime为例:

-mtime n:表示在n天之前的一天内被更改过的文件

-mtime +n:列出在n天之前(不含)被更改过的文件

-mtime -n:列出在n天之内(含)被更改过的文件

-newer file:列出比file还新的文件

2.与用户和用户组有关的参数

-uid n:n为数字,为用户的ID,存放在/etc/passwd内

-gid n:n为数字,为用户组的ID,存放在/etc/group内

-user  name:用户账户名

-group name:用户组名

-nouser:寻找文件所有者不存在/etc/passwd的文件

-nogroup:寻找文件的所有用户组不存在/etc/group的文件

 举例:

[root@localhost 桌面]# find /home -user wuchao
/home
/home/wuchao
/home/wuchao/.mozilla
/home/wuchao/.mozilla/extensions
/home/wuchao/.mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}
...省略

3.与文件权限和名称有关的

-name filename:查找文件名为filename的文件

-size [+-] SIZE:查找比SIZE还要大(+)或还要小(-)的文件。SIZE规格:c表所byte,k表示1024bytes。比50k大表示为-size + 50

-type TYPE:查找文件类型为TYPE的,类型有:一般正规文件(f),设备文件(b,c),目录(d),连接文件(l),socket(s),FIFO(f)

-perm mode:查找文件权限刚好等于mode 的文件,比如4755

-perm -mode:查找文件权限必须包括mode 的文件

-perm +mode:查找文件权限包含任一mode 的文件

4.其他可进行的操作

-exec  command:用command指令来处理查找到的结果

-print:将结果打印(默认)

举例:

[root@localhost tmp]# find . -perm +600
find: warning: you are using `-perm +MODE'.  The interpretation of `-perm +omode' changed in findutils-4.5.11.  The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
./yum.log
./hogsuspend
./ssh-Vl2SngviB1oB/agent.12163
./ssh-UyGb6ozbY7Su/agent.2798
./ssh-SlOFs0GOllv6/agent.3138
./ssh-0ASJ8KD3h4uu/agent.4027
./ssh-tk2YPsSGUr7c/agent.4794
./yum_save_tx.2016-06-27.13-25.jKQG67.yumtx
./yum_save_tx.2016-06-28.09-26._uGWlP.yumtx
./yum_save_tx.2016-06-27.14-46.8vdzCP.yumtx
./testing/testing
./yum_save_tx.2016-06-27.13-40.sLfZTd.yumtx
./ssh-7pbhryxqFMUw/agent.2872
./yum_save_tx.2016-06-27.14-37.wVK_cv.yumtx
./yum_save_tx.2016-06-27.14-40.YkzgxH.yumtx
./yum_save_tx.2016-06-28.08-15.U5XBSB.yumtx
./ssh-vMa62Qd9SUbS/agent.4144
[root@localhost tmp]# find . -perm +600 -exec ls -l {} ;
find: warning: you are using `-perm +MODE'.  The interpretation of `-perm +omode' changed in findutils-4.5.11.  The syntax `-perm +omode' was removed in findutils-4.5.12, in favour of `-perm /omode'.
-rw-------. 1 root root 0 6月  24 19:10 ./yum.log
prw-------. 1 root root 0 6月  28 11:14 ./hogsuspend
srw-------. 1 wuchao wuchao 0 6月  24 11:38 ./ssh-Vl2SngviB1oB/agent.12163
srw-------. 1 root root 0 6月  27 16:16 ./ssh-UyGb6ozbY7Su/agent.2798
srw-------. 1 root root 0 6月  28 08:14 ./ssh-SlOFs0GOllv6/agent.3138
srw-------. 1 root root 0 6月  28 08:17 ./ssh-0ASJ8KD3h4uu/agent.4027
srw-------. 1 root root 0 6月  28 08:18 ./ssh-tk2YPsSGUr7c/agent.4794
-rw-------. 1 root root 151271 6月  27 13:25 ./yum_save_tx.2016-06-27.13-25.jKQG67.yumtx
-rw-------. 1 root root 151271 6月  28 09:26 ./yum_save_tx.2016-06-28.09-26._uGWlP.yumtx
-rw-------. 1 root root 869 6月  27 14:46 ./yum_save_tx.2016-06-27.14-46.8vdzCP.yumtx
-rw-------. 1 root root 0 6月  27 20:52 ./testing/testing
-rw-------. 1 root root 151271 6月  27 13:40 ./yum_save_tx.2016-06-27.13-40.sLfZTd.yumtx
srw-------. 1 root root 0 6月  27 14:24 ./ssh-7pbhryxqFMUw/agent.2872
-rw-------. 1 root root 869 6月  27 14:38 ./yum_save_tx.2016-06-27.14-37.wVK_cv.yumtx
-rw-------. 1 root root 869 6月  27 14:40 ./yum_save_tx.2016-06-27.14-40.YkzgxH.yumtx
-rw-------. 1 root root 151271 6月  28 08:15 ./yum_save_tx.2016-06-28.08-15.U5XBSB.yumtx
srw-------. 1 root root 0 6月  28 11:17 ./ssh-vMa62Qd9SUbS/agent.4144
[root@localhost tmp]# 

 注意:发现在Ubuntu系统中没有-perm +mode,而是由-perm /mode替代,以下在Ubuntu的例子:

wuchao@wuchao-Lenovo:~/work$ ls -l
-rw-rw-r-- 1 wuchao wuchao   12 9月  26 11:07 file1           664
-rwxrw---x 1 wuchao wuchao 7634 9月  26 10:56 read.md         761

wuchao@wuchao-Lenovo:~/work$ find . -perm -641          //权限为641及以上
.
./read.md

wuchao@wuchao-Lenovo:~/work$ find . -perm -640      //权限为640及以上
.
./file1
./read.md

wuchao@wuchao-Lenovo:~/work$ find . -perm /640      //权限为640及以下
.
./file1
./read.md
wuchao@wuchao-Lenovo:~/work$ find . -perm /641      //权限为641及以下
.
./file1
./read.md


wuchao@wuchao-Lenovo:~/work$ find . -perm -020      //查看用户组具有w权限的文件
.
./file1
./read.md


 

原文地址:https://www.cnblogs.com/wuchaodzxx/p/5622801.html