第四节Linux下的目录与文档管理

回复 收藏
本帖最后由 wuhen 于 2014-11-18 22:29 编辑

本节大纲
内容概要:
一、which 命令:查看命令的绝对路径
1.用户切换
su:switch user
#su [-l] 用户名

[root@Kevin ~]# su kevin   //半切换,切换到kevin用户,但是不读取kevin用户的配置文件
[kevin@Kevin root]$ exit
exit
[root@Kevin ~]# su - kevin   //完全切换,执行这个命令的时候表示切换到kevin用户,并且重新读取用户环境相关配置文件
[kevin@Kevin ~]$ exit
logout
[root@Kevin ~]# clear   /*清屏*/

2.pwd
[root@Kevin ~]# pwd   //printing working directory,显示当前目录
/root

3.cd
cd:change directory 切换目录
cd 切换到用户的家目录,也就是主目录,Home directory 家目录可以用~表示,所以此命令也可以cd ~

[root@Kevin /]# cd
[root@Kevin ~]#
[root@Kevin /]# cd ~
[root@Kevin ~]#
还可以这样用
root@Kevin /]# cd ~kevin   /*切换到kevin用户的家目录*/    cd ~USERNAME:进入指定用户的家目录,当然对权限有要求
[root@Kevin kevin]# pwd
/home/kevin
[root@Kevin kevin]#
cd -:在当前目录和前一次所在的目录之间来回切换

[root@Kevin kevin]# cd -
/
[root@Kevin /]# cd -
/home/kevin
[root@Kevin kevin]#

命令历史:
history:查看命令历史 默认1000行
-c:清空命令历史
-d:OFFSET[n]:删除指定位置的命令
-w:保存命令历史至历史文件

命令历史的使用技巧:
!n:执行命令历史中的第n条命令
[root@Kevin ~]# !15
echo $HISTSIZE
1000


!-n:执行命令历史中倒数第n条命令
[root@Kevin ~]# !-5
echo $HISTSIZE
1000
!!:执行上一条命令
[root@Kevin ~]# !!
echo $HISTSIZE
1000
!string:执行命令历史中最近一个以指定字符串开头的命令
[root@Kevin ~]# !echo
echo $HISTSIZE
1000
!$:引用前一个命令的最后一个参数
[root@Kevin ~]# nano /tmp/inittab
[root@Kevin ~]# nano !$
nano /tmp/inittab
Esc,.:先按Esc,放开,再按点。同样引用前一个命令的最后一个参数
Linux命令的返回值:
在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结束时,都会返回一个数字值,这个值叫做返回值,或者称为错误号 ( Error Number )。
在控制台下,有一个特殊的环境变量 $?,保存着前一个程序的返回值,我们可以试试:
$ ls *.png
Diagram1.png  eqn.png         peazip.png
eqn4.png      Mandelbrot.png  x2.png
$ echo $?
0

先随便执行个命令,比如像上面的 ls 某些文件,然后通过 echo $?,打印 $? 的值~
我们发现返回值是 0,这是什么意思呢?
只要返回值是 0,就代表程序执行成功了~
也就是说,如果 $? 变量的值不是 0 的话,就表示上一个命令在执行的过程中出错了。我们可以试着 ls 一个不存在的文件:
$ ls linuxgem
ls: 无法访问 linuxgem: 没有那个文件或目录
$ echo $?
2

这样,对于某些打印出一堆不熟悉的英文信息的命令,可以方便的看出它是否成功执行结束。
不过,每次都 echo $? 一下太累了,没关系,你可以把 $? 放在提示符里去:
galeki@localhost ~ $ export PS1="[\$?]${PS1}"
[0]galeki@localhost ~ $

export PS1="[\$?]${PS1}"  这个命令把 $? 的值放在的提示符的最前面,这样每次执行完命令,这个值都会自动更新,这下就一目了然了~
那么如果返回的值不是 0,我们要怎么知道是那里出错了呢? 大多数的程序出错都会给出提示,如果没有提示的话,可以用perror(必须安装MySQL才会有) 这个程序来查看错误的信息,比如返回值是 2,我们可以运行:
$ perror 2
OS error code   2:  No such file or directory

这样就清楚了,原来是文件不存在~
具体见帖子:http://www.aminglinux.com/bbs/thread-7079-1-1.html
二、目录相关的几个命令
mkdir   关注-p选项 创建递归目录
rmdir  同样也有一个-p选项 删除内容为空的递归目录,专门删除目录无-r选项,不能删除文件。
rm   很好用既能删除目录又能删除文件
-r 删除目录
-f 强制删除不再询问跟/bin/rm意思一样 这两个参数我们经常一起使用,但不会报错
cp  既可以拷贝文件也可以拷贝目录
-r 拷贝目录
Linux下默认cp命令是有别名(alias cp='cp -i')的,无法强制覆盖,即使你用 -f 参数也无法强制覆盖文件,下面提供Linux下cp 覆盖方法.
1)/bin/cp使用绝对路径

2) 取消cp的alias,放心这不是永久生效
#unalias cp
#cp a /test/a

3) 用 \cp 执行cp命令时不走alias
#\cp a /test/a 脱义字符
mv  重命名或者移动, 跟cp一样对文件来说有时我们使用/bin/mv强制覆盖不再询问,  当我们mv目录时,注意若是目标目录存在的情况下,那么会把源目录移动到目标目录里。不能同名目录,目标目录不为空进行覆盖
touch:创建文件a,如果存在,则会更改三个时间戳,对目录也是一样的效果。
PS:atime:accesstime访问时间;mtime:modifytime修改内容时间;ctime:changetime改变文件权限时间
查看三个time命令stat

三、 和文本相关的命令
查看文本常用的命令有cat、tac、more、less、head、tail、od等
cat:由第一行开始显示文件内容。
tac:从最后一行开始显示,可以看出tac是cat的。
more:一页一页地显示文件内容。
less:与more类似,但是比more更好的是,它可以往前翻页!
head:只看头几行。
tail:只看结尾几行。
od:以二进制的方式读取文件内容!

1.cat:concatenate,连接并显示文本内容。
[root@Kevin ~]# cat -n /etc/issue      ##显示行号,跟内容无关,只是对显示内容编号
     1     CentOS release 6.4 (Final)
     2     Kernel \r on an \m
     3     对于Linux系统而言,所有文本文件行结束符是$,而windows的结束符是$+Enter.
[root@Kevin ~]# cat -E /etc/issue  ##显示换行符
CentOS release 6.4 (Final)$
Kernel \r on an \m$
$
这里如果直接输入cat,没接参数的话,从标准输入读取内容,并显示到标准输出,需要用Ctrl+C中断。
如果输入命令,输入一半不想执行,也可以用Ctrl+C中断,而不用删回重新输入。
如果在终端中输入的话,想查看输出的上下文,可以按Shift+page up/page down,不过如果文件比较大的话,因为内存控制,会显示不完。

2.tac:反向显示文本。
[root@Kevin ~]# tac /etc/issue

Kernel \r on an \m
CentOS release 6.4 (Final)
与cat相反,tac是由最后一行到第一行反向在屏幕上显示出来的。

3.more:分页显示文本,向后翻。
[root@Kevin ~]# more /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6f
#
# For more information about this file, see the man pages man(1)
# and man.conf(5).
#
# This file is read by man to configure the default manpath (also used
--More--(5%)
空格键(space):代表向下翻页;
Enter:代表向下滚动一行;
/字符串:代表在这个显示内容当中,向下查询"字符串"这个关键字;
:f:立刻显示出文件名以及目前显示的行数;
q:代表立刻离开more,不再显示该文件内容;
b或者Ctrl+b:代表往回翻页,不过这个操作只对文件有用,对管道无用。
more显示内容,翻到最后一页会自动退出。
4.less:分页显示文本;翻到最后不会退出,要按q退出。
命令类似more,不过有些许不同。
PageDown:向下翻动一页;也可以使用空格,space;也可以使用f或Ctrl+f
PageUp:向上翻动一页;也可以使用b或Ctrl+b
/字符串:向下查询"字符串"的功能;
?字符串:向上查询"字符串"的功能;
n:重复前一个查询(与/或?有关);
N:反向重复前一个查询(与/或?有关);
q:离开
j:向下滚动一行
k:向上滚动一行
shift+G或G,最下面
shift+g或g,最上面


5.head:查看前n行(默认n=10)

[root@Kevin ~]# head /etc/inittab     ##默认显示前10行
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#


[root@Kevin ~]# head -n 20 /etc/inittab   ##显示前20行,也可以直接head -20 /etc/inittab
[root@Kevin ~]# head -n -100 /etc/inittab   ##后面100行不显示,只显示前面的内容。


6.tail:显示后n行(默认n=10)
[root@Kevin ~]# tail -f /var/log/messages   ##持续监测messages文件,不退出,等待显示后续追加至此文件的新内容,Ctrl+C结束
Aug 18 19:56:10 Kevin NetworkManager[1367]:  (eth0): device state change: 2 -> 3 (reason 40)
Aug 18 19:56:10 Kevin kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Aug 19 03:52:34 Kevin kernel: pickup[4695]: segfault at 0 ip (null) sp bfeb1aac error 14 in libm-2.12.so[12a000+28000]
Aug 19 04:23:53 Kevin kernel: e1000: eth0 NIC Link is Down
Aug 19 04:23:53 Kevin NetworkManager[1367]:  (eth0): carrier now OFF (device state 3)
Aug 19 04:23:53 Kevin NetworkManager[1367]:  (eth0): device state change: 3 -> 2 (reason 40)
Aug 19 04:23:53 Kevin NetworkManager[1367]:  (eth0): deactivating device (reason: 40).
Aug 19 04:23:59 Kevin kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Aug 19 04:23:59 Kevin NetworkManager[1367]:  (eth0): carrier now ON (device state 2)
Aug 19 04:23:59 Kevin NetworkManager[1367]:  (eth0): device state change: 2 -> 3 (reason 40)
[root@Kevin ~]# tail -n +100 /etc/man.config  ##如果不知道有几行,想列出100行以后的内容
tail -f /var/log/messages 动态的查看文件,用来查看日志 -F 是--follow=name --retry的缩写, --follow=name是按照文件名跟踪文件, 可以定期去重新打开文件检查文件是否被其它程序删除并重新建立. --retry这个参数, 保证文件重新建立后,可以继续被跟踪.具体见:http://www.douban.com/note/85851188/?qq-pf-to=pcqq.c2c
四、文件或目录的属性权限对于文件和目录,意义并不相同。
QQ图片20141118221749.jpg

共分为十一段有的文件最后有一个点是关于selinux的一个特殊位我们不用关注
- 普通文件
        d 目录文件  
        b 块设备文件
        c 字符文件
        l 连接文件
        p 管道文件
        s 套接字文件:linux或unix特有文件为了进程间的通信,只能本地。
之后9个字符,每三个为一组,分别对应后面的用户和组所具有的权限
第一个root是用户 第二个root是组 前两组就与此对应
        那么最后一组是给谁用的呢?        除了(属主user)和属组group用户外,是第三组的权限,我们称它为other,也就是既不是属主又不是属组中的成员
获取权限的流程
        首先分配给root所有权限 -> 然后分派user位权限 -> 再分派group位权限--> 最后分派other位权限
对于文件
r:可读,可以使用类似cat等命令查看文件内容;
w:可写,可以编辑或删除此文件;
x:可执行,execute,可以命令提示符下当作命令提交给内核运行;

对于目录
r:可以对此目录执行ls以列出内部所有文件;

w:可以在此目录下的所有文件及目录进行相关更改,也就是可以更改这个目录下的结构列表,具体权利如下:
可以在此目录下创建新的文件或目录;
可以在此目录下删除存在的文件或目录(无论改文件的权限是什么,这点要注意)
可以重命名及改变文件或目录的位置。
x:可以使用cd切换进此目录,可以使用ll -d查看目录的属性信息。

0 000 ---:无权限
1 001 --x:执行
2 010 -w-:写
3 011 -wx:写和执行
4 100 r--:只读
5 101 r-x:读和执行
6 110 rw-:读写
7 111 rwx:读写执行

755:rwxr-xr-x     640:rw-r-----     660:rw-rw----     775:rwxrwxr-x
inode连接数:允许inode连接多个文件,一个目录和它之下的‘.’和此目录子目录下的‘..’共享同一个inode号。目录不能创建硬链接表示有多少文件或目录使用跟当前目录使用相同的inode号的数目。
查看inode:ls -li

对于目录下的文件的权限
[root@www aa]# ll -d .  ##用root账号,给目录所有权限
drwxrwxrwx 2 root root 4096 Nov 17 19:54 .

[root@www aa]# ll  ##将文件a的权限清0
total 0
---------- 1 root root 0 Nov 17 19:54 a

[openstack@www aa]$ ll  ##用openstack用户登录,并用vi编辑文件a,用命令:wq!强制保存退出,退出后发现此文件的属主属组都变成了openstack
total 4
---------- 1 openstack openstack 18 Nov 17 19:55 a

[openstack@www aa]$ chmod 777 a  ##更改文件a的权限
[openstack@www aa]$ ll
total 4
-rwxrwxrwx 1 openstack openstack 18 Nov 17 19:55 a

以上操作说明,目录的w权限对文件的影响很大哦,要特别注意。

五、更改权限
chown:[change owner]改变文件属主或属组(只有管理员可以使用此命令)

chown USERNAME file,...

-R:修改目录及其内部文件的属主
--reference=/path/to/somefile file,...  参考某个文件,设定新文件跟参考文件属主一样

chown USERNAME:GRPNAME file,...
chown USERNAME.GRPNAME file,...
chown :GRPNAME file,...

[root@Kevin ~]# chown user1 /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rw-r--r--. 1 user1 root 0 Aug 17 17:49 /tmp/hadoop

[root@Kevin ~]# mkdir /tmp/k
[root@Kevin ~]# cd /tmp/k
[root@Kevin k]# touch {a,b}
[root@Kevin k]# ls -l
total 0
-rw-r--r--. 1 root root 0 Aug 17 18:06 a
-rw-r--r--. 1 root root 0 Aug 17 18:06 b
[root@Kevin k]# chown -R user1 /tmp/k  ##修改目录及其内部文件的属主
[root@Kevin k]# ls -l
total 0
-rw-r--r--. 1 user1 root 0 Aug 17 18:06 a
-rw-r--r--. 1 user1 root 0 Aug 17 18:06 b

[root@Kevin k]# ls -l /tmp
total 64
-rw-r--r--. 1 root  root     0 Aug 17 17:49 hadoop
drwxr-xr-x. 2 user1 root  4096 Aug 17 18:06 k
...

[root@Kevin k]# chown --reference=/tmp/hadoop /tmp/k  ##将/tmp/k的属主改为跟/tmp/hadoop一样
[root@Kevin k]# ls -l /tmp
total 64
-rw-r--r--. 1 root  root     0 Aug 17 17:49 hadoop
drwxr-xr-x. 2 root  root  4096 Aug 17 18:06 k
...

chgrp:[change group]改变文件属组
-R
--reference=/path/to/somefile file,...


chmod:修改目录或文件的权限
修改三类用户的权限:
chmod MODE file,...
-R
--reference=/path/to/somefile file,...
[root@Kevin k]# chmod 750 /tmp/hadoop
[root@Kevin k]# ls -l /tmp
total 64
-rwxr-x---. 1 root  user1    0 Aug 17 17:49 hadoop
...

[root@Kevin k]# chmod 75 /tmp/hadoop
[root@Kevin k]# ls -l /tmp
total 64
----rwxr-x. 1 root  user1    0 Aug 17 17:49 hadoop
...

修改某类用户的权限:
u,g,o,a
chmod 用户类别=MODE file,...

[root@Kevin k]# ls -l /tmp/hadoop
-rwxr-xr-x. 1 root user1 0 Aug 17 17:49 /tmp/hadoop
[root@Kevin k]# cd ~
[root@Kevin ~]# chmod g=rw /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rwxrw-r-x. 1 root user1 0 Aug 17 17:49 /tmp/hadoop

[root@Kevin ~]# chmod g=r,o=r /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rwxr--r--. 1 root user1 0 Aug 17 17:49 /tmp/hadoop

[root@Kevin ~]# chmod go=rw /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rwxrw-rw-. 1 root user1 0 Aug 17 17:49 /tmp/hadoop

[root@Kevin ~]# chmod g=rx,o= /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rwxr-x---. 1 root user1 0 Aug 17 17:49 /tmp/hadoop


修改某类用户的某位或某些位的权限:
u,g,o,a
chmod 用户类别+|-MODE file,...

[root@Kevin ~]# chmod u-x /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rw-r-x---. 1 root user1 0 Aug 17 17:49 /tmp/hadoop

[root@Kevin ~]# chmod u-x,g+w /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rw-rwx---. 1 root user1 0 Aug 17 17:49 /tmp/hadoop

[root@Kevin ~]# chmod a+x /tmp/hadoop
[root@Kevin ~]# ls -l /tmp/hadoop
-rwxrwx--x. 1 root user1 0 Aug 17 17:49 /tmp/hadoop
同步时间:date -s '2014-11-18 21:37:00'或者ntpdate time.windows.com
umask:默认权限
功能说明:指定在建立文件时预设的权限掩码
要点:文件基数为666,目录基数为777,即文件未设x位,目录可设x位。默认权限为[基数-umask]

文件默认不能具有执行权限,如果算得的结果中有执行权限,则将其权限+1.
例题:设置umask 003
QQ图片20141118221714.jpg

我们不能简单的加减,要对应位置。
六、特殊权限
lsattr
[root@www Music]# lsattr
-------------e- ./a
-------------e- ./b

chattr
[root@www Music]# chattr +a a  ##给a文件加上a权限
[root@www Music]# lsattr
-----a-------e- ./a
-------------e- ./b

[root@www Music]# rm -rf a  ##加上a权限之后,无法删除a文件
rm: cannot remove `a': Operation not permitted
[root@www Music]# mv a a.txt  ##无法重命名a文件
mv: cannot move `a' to `a.txt': Operation not permitted
[root@www Music]# echo "1111" >a  ##无法重定向到a文件
-bash: a: Operation not permitted
[root@www Music]# echo "1111" >>a  ##可以追加输出到a文件

给a文件加上a权限之后,不能被删,不能重命名,不能重定向,只能追加输入,也就是说,只能往里写东西了,其他的操作都无法执行

[root@www Music]# chattr -a a  ##把a文件的a权限去掉
[root@www Music]# lsattr
-------------e- ./a
-------------e- ./b

[root@www Music]# chattr +i b  ##给b文件加上i权限
[root@www Music]# lsattr
-------------e- ./a
----i--------e- ./b

给b文件加上i权限之后,b文件不能被删除,不能重命名,不能重定向,不能追加输入,也就是说,b文件被完全锁死了。







2014-11-18 22:11 举报
已邀请:
0

MR_K

赞同来自:

{:5_121:}{:5_121:}
0

wuhen

赞同来自:

{:5_121:}
0

王肖强

赞同来自:

很强大 !
0

齐天大圣

赞同来自:

又学了点新知识{:4_107:}
0

xiaotuanyu120

赞同来自:

写的很详细呀,分享一个知识点,pwd并不一定是你所在的真实路径,如果你想查看真实的物理路径,请加-P参数
QQ截图20141120190904.png

例如我在123文件夹的软连接中,pwd和pwd -P显示的是不一样的,
估计pwd默认读取的是软连接所在目录的inode文件名清单里的软连接的路径,
而-P以后,是先用软连接的block找到源文件,然后用源文件所在目录里的inode文件名清单找到了真正的物理路径
0

NJ凯温

赞同来自:

向LZ学习,drwx-x-x-r

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: