6-Linux文件与目录管理

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1

Welcome to my github: https://github.com/gaoxiangnumber1

6.1 目录与路径

6.1.1 相对路径与绝对路径

  • 若写程序(shell scripts)管理系统,务必使用绝对路径。因为绝对路径肯定不会有问题;若使用相对路径,可能由于执行的工作环境不同导致问题。

6.1.2 目录的相关操作

  • 特殊的目录:
    . 代表当前目录
    .. 代表上一层目录
    - 代表前一个工作目录
    ~ 代表目前用户的家目录;~account代表account用户的家目录
  • 在所有目录下都会存在...两个目录。根目录的上一层..与根目录自己.是同一个目录。

cd(change directory变换目录)

cd [相对路径或绝对路径]
cd ..           #表示去上层目录
cd -            #表示回到刚刚的目录
cd ~           #表示回自己家目录
cd ~xiang  #代表去xiang用户的家目录
cd          #没有加任何路径,代表回自己家目录

pwd(Print Working Directory显示目前所在目录)

pwd [-P] #-P显示真实路径,非链接路径

mkdir(建立新目录)

mkdir [-mp] 目录名称
  • -m 设置文件权限,不需要看默认权限umask
    -p 默认:目录一层层的建立。-p将目录(包含上层目录)递归建立

rmdir(删除空目录)

rmdir [-p] 目录名称 #-p:连同上层的空目录一起删除
  • 空目录:没有任何东西的目录。空目录的上层目录必定非空。

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

  • 当执行指令XX时,系统会去每个PATH定义的目录下搜索文件名为XX的可执行文件;若在PATH定义的目录中含有多个名为XX的可执行文件,那么先搜到的指令先被执行。
  • echo $PATH显示目前的PATH。$后面接变量。
    PATH变量的内容由目录组成,目录之间用冒号:隔开,每个目录有顺序之分。
xiang :~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
xiang :~ $ sudo -i
[sudo] password for xiang: 
root :~ # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • 不同用户默认的PATH不同,默认能执行的指令不同。
  • PATH="${PATH}:absolute_path_name"将absolute_path_name加入到PATH中。不能将本目录.加入PATH中,原因:
    1. 由于工作目录不固定,因此能执行的指令会变化,这对用户不好。
    2. 避免黑客将病毒伪装成正常指令,使用户没有意识到就执行。为了安全,不将.加入PATH中。

6.2 文件与目录管理

6.2.1 文件与目录的检视:ls

ls [-aAdfFhilnrRSt] 文件名或目录名
ls [--color={never,auto,always}] 文件名或目录名
ls [--full-time] 文件名或目录名
  • ls默认显示:非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色。
    -a 列出全部文件(包括隐藏文件)
    -A 列出全部文件,但不包括...这两个目录
    -d 仅列出目录本身,而不是列出目录内的文件数据
    -f 直接列出结果,不进行排序(ls默认以文件名排序)
    -F 额外列出数据结构。*可执行文件;/目录;=socket文件;|FIFO文件
    -h 将文件容量以易读的方式(GB/KB等)列出
    -i 列出inode号码
    -l 列出文件属性、权限等数据
    -n 列出UID与GID不用户与群组的名称
    -r 将排序结果反向输出
    -R 连同子目录内容一起列出,等于该目录下的所有文件都会显示出来
    -S 以文件容量大小排序,而不是用文件名排序
    -t 依时间排序,而不是用文件名排序
    –color=never 不要根据文件特性给予颜色显示
    –color=always 显示颜色
    –color=auto 让系统自动判断是否给予颜色
    –full-time 以完整时间格式“年/月/日/时/分”输出
    –time={atime,ctime} 输出access时间或改变权限属性时间ctime不内容变
    更时间modification time

6.2.2 复制cp、删除rm、移动mv

  • cp复制文件、建立链接档、比对两文件的新旧予以更新、复制整个目录。
    mv移动目录与文件、重命名。
    rm移除

cp(复制文件或目录)

cp [-adfilprsu] 源文件 目标文件
cp [options] source1 source2 source3 ... directory
  • -a 等于-dr --preserve=all
    -d 若源文件为链接文件,则复制链接文件本身
    -f 若目标文件已存在且无法打开,则移除后再尝试一次
    -i 若目标文件已存在,覆盖时会先询问
    -l 建立hard link链接档,不复制文件本身
    -p 连同文件的属性(权限、用户、时间)一起复制,不使用默认属性
    -r 递归持续复制
    -s 复制成符号链接文件symbolic link
    -u destination比source旧才更新destination,或destination不存在才复制
    –preserve=all 除了-p的相关参数外,还复制SELinux的属性(links,xattr)
  • 若来源档有两个以上,则最后一个目标文件一定是目录。
  • -r可以复制目录,但权限可能会被改变。备份用cp -au src dest
xiang :~ $ ls -l data
-rw-rw-r--  1   xiang xiang 16  109 23:33    data
xiang :~ $ cp -l data data_hard_link
xiang :~ $ cp -s data data_symbolic_link
xiang :~ $ ls -l data*
-rw-rw-r--  2   xiang xiang 16  109 23:33    data
-rw-rw-r--  2   xiang xiang 16  109 23:33    data_hard_link
lrwxrwxrwx  1   xiang xiang 4   109 23:34    data_symbolic_link -> data
  • -l建立hard link,-s建立symbolic link。symbolic link是快捷方式,会链接到源文件,文件名右侧会有->符号。hard link文件与源文件的属性、权限完全一样,与未链接前的差异是第二栏的link数由1变成2。
xiang :~ $ cp data_symbolic_link data_symbolic_link1
xiang :~ $ cp -d data_symbolic_link data_symbolic_link2
xiang :~ $ ls -l data data_symbolic_link*
-rw-rw-r-- 2 xiang xiang 16 10月 9 23:33 data
lrwxrwxrwx  1   xiang xiang 4   109 23:34    data_symbolic_link -> data
-rw-rw-r-- 1 xiang xiang 16 10月 9 23:38 data_symbolic_link1#与源文件相同
lrwxrwxrwx  1   xiang xiang 4   109 23:38    data_symbolic_link2->data #链接档
  • 若没有加任何选项,cp复制源文件;-d复制链接文件。
#使用xiang的身份,完整复制`/var/log/wtmp`文件到/tmp并重命名为xiang_wtmp
xiang :~ $ cp -a /var/log/wtmp /tmp/xiang_wtmp
xiang :~ $ ls -l /var/log/wtmp /tmp/xiang_wtmp 
-rw-rw-r-- 1 xiang xiang 238K 10月 10 12:14 /tmp/xiang_wtmp
-rw-rw-r-- 1 root utmp 238K 10月 10 12:14 /var/log/wtmp
  • 由于xiang的身份不能修改文件的拥有者与群组,虽然能复制wtmp的权限、时间等属性,但是与拥有者、群组相关的属性,原本xiang身份无法进行的动作,即使加上-a也无法完整复制权限。

rm(移除文件或目录)

rm [-fir] 文件或目录
  • -f 忽略不存在的文件
    -i 在删除前会询问用户
    -r 递归删除
rm -i bashrc*   #将开头为bashrc的文件名全部删除。*代表0到无穷多个任意字符
\rm -r /tmp/etc #在指令前加上反斜杠可以忽略alias的指定选项
rm ./-file_name #删除开头带有`-的文件:加上本目录`./`避过字符`-`

mv(移动文件与目录,或重命名)

mv [-fiu] source destination
mv [options] source1 source2 source3 .... directory
  • -f 若目标文件已存在,不询问直接覆盖
    -i 若目标文件已存在,询问是否覆盖。
    -u 若目标文件已存在,且source新,才会更新destination
  • mv file file2重命名file为file2;rename指令进行多个文件名的同时重命名。
  • 若有多个源文件或目录,则最后一个目标文件一定是目录。

6.2.3 取得路径的文件名与目录名称

xiang :~ $ basename /home/xiang/Gao/Notes/blog.c  #取得文件名
blog.c
xiang :~ $ dirname /home/xiang/Gao/Notes/blog.c   #取得目录名
/home/xiang/Gao/Notes

6.3 文件内容查阅

6.3.1 直接检视文件内容

cat(concatenate)

cat [-AbEnTv]
  • -A 相当于-vET,可列出特殊字符而不是空白
    -b
    -E 显示结尾的断行字符$;Windows的断行符是^M$
    -n 对所有行显示行号
    -T 将tab^I显示
    -v 列出一些看不出来的特殊字符

tac(反向显示)

  • 功能与cat相反:由最后一行到第一行显示。

nl(添加行号打印)

nl [-bnw] 文件
  • -b 指定显示行号的方式,有两种:
    (1)-b a表示对所有行显示行号
    (2)-b t仅对非空白行显示行号
    -n 列出显示行号的方法,有三种:
    (1)-n ln行号在屏幕最左方显示
    (2)-n rn行号在字段的最右方显示,且不加0
    (3)-n rz行号在字段的最右方显示,加0
    -w 行号占用的字符数

6.3.2可翻页检视

more(一页页翻动)

  • more file # #
  • 若more的文件行数大于屏幕的行数,最后一行显示目前显示的百分比,可以在最后一行输入指令:
    空格键 向下翻一页
    Enter 向下翻一行
    / 向下搜索string
    :f 显示文件名及目前显示的行数
    q 退出more
    b或Ctrl+b 往回翻页(只对文件有用,对管线无用)

less(一页一页翻动)

  • 用more时无法向前翻;用less时可以往前往后翻。指令有:
    空格键 向下翻一页
    pg down 向下翻一页
    pg up 向上翻一页
    /字符串 向下搜索字符串
    ?字符串 向上搜索字符串
    n 重复前一个搜索(相对/或?)
    N 反向重复前一个搜索(相对/或?)
    g 到第一行
    G 到最后一行
    q 退出less

6.3.3资料撷取

head(取出前几行)

head [-n X] 文件
  • 默认显示前十行。
    -n接正数X,代表显示前X行;接负数X,代表不显示后|X|行。

tail(取出后几行)

tail [-n X] 文件
  • -n 默认显示最后十行。接数字X,代表显示X行
    -f 若文件随时会有数据写入,且想让该文件有数据写入时就立刻显示。-f会持
    续侦测文件,直至按下Ctrl+c
  • tail -n +100 file #只列出100行后的数据
  • head -n 20 file | tail -n 10显示file的11-20行
    管线|:前面指令的输出通过管线交给后面指令使用。head -n 20 file将文件的20行取出,但不输出到屏幕上,而是交给tail指令,因此tail不需要接文件名。
  • cat -n file | head -n 20 | tail -n 10 #列出file的11-20行,且有行号。

6.3.4 非纯文本档:od

od [-t TYPE] 文件
  • -t后接各种类型的输出:
    a 使用默认字符输出
    c 使用ASCII字符输出
    d[size] 使用十进制(decimal)输出,每个整数占size bytes
    f[size] 使用浮点数(floating)输出,每个数占size bytes
    o[size] 使用八进制(octal)输出,每个整数占size bytes
    x[size] 使用十六进制(hexadecimal)输出,每个整数占size bytes
xiang :~ $ od -t oCc /etc/issue #列出/etc/issue内容的8进制值与ASCII对照表
0000000 125 142 165 156 164 165 040 061 064 056 060 064 056 063 040 114
          U   b   u   n   t   u       1   4   .   0   4   .   3       L
0000020 124 123 040 134 156 040 134 154 012 012
          T   S       \   n       \   l  \n  \n
0000032

xiang :~ $ echo gaoxiangnumber1 | od -t dCc #找到gaoxiangnumber1的ASCII对照
0000000  103   97  111  120  105   97  110  103  110  117  109   98  101  114   49   10
           g    a    o    x    i    a    n    g    n    u    m    b    e    r    1   \n
0000020

6.3.5 修改文件时间或建置新档:touch

  • Linux文件有三个主要的变化时间:
    1. modification time(mtime):当文件内容改变时更新该时间,不包括权限/属性的更改。
    2. status time(ctime):当文件状态改变时更新该时间。如文件内容、权限、属性被更改,都会更新该时间。
    3. access time(atime):当文件内容被取用时,更新该时间。
xiang :~ $ date; ls -l power.c ; ls -l --time=atime power.c ; ls -l --time=ctime power.c 
2016年 10月 11日 星期二 08:18:40 CST          #目前时间
-rw-rw-r-- 1 xiang xiang 393 104 12:17 power.c #ls默认显示mtime -rw-rw-r-- 1 xiang xiang 393 1010 23:23 power.c #atime -rw-rw-r-- 1 xiang xiang 393 104 12:17 power.c #ctime
touch [-acdmt] 文件
  • -a 修改access time
    -c 修改文件的时间,若该文件不存在则不建立新文件
    -d 接欲修改的日期,也可以用--date="日期或时间"
    -m 修改mtime
    -t 接欲修改的时间,格式为YYYYMMDDhhmm
touch -d "2 days ago" file          #将日期调整为两天前
touch -t 201406150202 bashrc        #将日期改为2014/06/15 2:02
  • touch新建的文件的三个时间(atime/ctime/mtime)默认为目前时间。
    复制文件时,即使复制所有属性,也无法复制ctime。

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

6.4.1 文件默认权限umask

  • umask是目前用户在建立文件或目录时的默认权限值。查阅方式有两种:
    1. umask得到数字形式的权限。
    2. umask -S得到符号形式的权限。
xiang :~ $ umask
0002#与一般权限有关的是后三个数字
xiang :~ $ umask -S
u=rwx,g=rwx,o=rx
  • 建立文件默认没有可执行权限,默认权限为-rw-rw-rw-
    建立目录默认所有权限均开放,默认权限为drwxrwxrwx
  • umask的数字指默认需要减掉的权限。

6.4.2 文件隐藏属性

chattr(设置文件隐藏属性)

chattr [+-=][ASacdistu] 文件或目录 #该指令只在Ext2/Ext3/Ext4文件系统上有效
    • 增加某个参数
    • 移除某个参数
      = 设定一定,且仅有后面接的参数
      A 存取此文件/目录时,它的访问时间atime不会修改。
      S 文件默认是异步写入磁盘;设定S后,任何文件的修改会同步写入磁盘。
      a 文件只能增加数据,不能删除/修改数据。只有root才能设定该属性。
      c 保存文件时,先将文件压缩再存储;读取时自动解压缩。
      d 当dump程序执行时,设定d属性使该文件/目录不会被备份。
      i 文件不能被删除、改名、设定链接、写入或新增数据。只有root能设定。
      s 若该文件被删除,它将会被完全移除硬盘空间。若误删,无法还原。
      u 若该文件被删除,它的数据还存在磁盘中,可以用来还原该文件。

lsattr(显示文件隐藏属性)

lsattr [-adR] 文件或目录
  • -a 将隐藏文件的属性也列出来
    -d 若接目录,仅列出目录的属性,不包括目录内的文件名
    -R 连同子目录的数据也列出来

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

xiang :~ $ ls -ld /tmp; ls -l /usr/bin/passwd 
drwxrwxrwt  8 root root 44K 1011 10:13    /tmp
-rwsr-xr-x  1 root root 46K  716  2015    /usr/bin/passwd

Set UID

  • Set UID(SUID)出现在文件拥有者x位置上的s。SUID的限制与功能:
    1. SUID仅对二进制程序(binary program)有效,不能用于shell script。
    2. 执行者对该程序需要有可执行权限x
    3. 执行者在执行程序过程中具有程序owner的权限。
  • Linux所有账号的密码都记录在/etc/shadow中,该文件的权限为
    -rw-r----- 1 root shadow。虽然只有root有w权限,但一般用户xiang也能修改自己的密码,原因:
    1. 执行者xiang对/usr/bin/passwd程序具有x权限。
    2. /usr/bin/passwd的拥有者是root。
    3. xiang在执行passwd时会获得root的权限,所以/etc/shadow可以被xiang执行的passwd修改。
      但是xiang不能用cat读取/etc/shadow因为cat不具有SUID权限。

Set GID

  • Set GID(SGID):出现在文件拥有者x位置的s。SGID可对文件或目录设定。
  • SGID对文件的功能:
    1. SGID对二进制程序有效。
    2. 程序执行者对程序需具备x权限。
    3. 执行者在执行程序过程中获得程序群组的权限。
  • SGID对目录的功能:
    1. 用户若对此目录有r与x权限,则用户能进入此目录;用户在此目录下的有效群组(effective group)变成该目录的群组。
    2. 用户若对此目录有w权限(可以新建文件),则用户建立的新文件的群组与此目录的群组相同。

Sticky Bit

  • SBIT只对目录有效,作用:当用户对此目录有w、x权限时,对于用户在该目录下建立的文件或目录,仅有自己与root才有权限删除。
    当甲用户对A目录是群组成员或其它人,并且拥有该目录的w权限时,甲对该目录内任何人建立的目录或文件均可进行删除等动作。但是若A目录加上SBIT,则甲只能对自己建立的文件或目录进行删除等动作,无法删除它人的文件。

SUID/SGID/SBIT权限设定

  • SUID不用于目录,SBIT不用于文件。
  • 数字形式权限三个数字前的数字代表SUID/SGID/SBIT:4-SUID、2-SGID、1-SBIT。
  • 将文件权限改为-rwsr-xr-x:由于s在用户权力中,所以是SUID,在原先755前加上4:chmod 4755 file
xiang :~ $ touch test
xiang :~ $ chmod 4755 test ; ls -l test 
-rwsr-xr-x 1 xiang xiang 0 1011 11:40 test
xiang :~ $ chmod 6755 test ; ls -l test 
-rwsr-sr-x 1 xiang xiang 0 1011 11:40 test
xiang :~ $ chmod 1755 test ; ls -l test 
-rwxr-xr-t 1 xiang xiang 0 1011 11:40 test
xiang :~ $ chmod 7666 test ; ls -l test 
-rwSrwSrwT 1 xiang xiang 0 1011 11:40 test
  • s与t都取代x权限;7666说明user/group/others都没有x权限,所以S、T代表空。也可以通过符号处理:SUID为u+s,SGID为g+s,SBIT为o+t。

6.4.4 观察文件类型:file

6.6 权限与指令间的关系

一、让用户能进入某目录成为工作目录的基本权限

  • 目录所需权限:用户对该目录至少有x权限。
  • 额外需要权限:若用户想在该目录内利用ls查阅文件名,则用户对此目录需要r权限。

二、用户在某目录内读取文件的基本权限

  • 目录所需权限:用户对该目录至少有x权限。
  • 文件所需权限:用户对文件至少有r权限。

三、让用户可以修改文件的基本权限

  • 目录所需权限:用户对该文件所在的目录至少有x权限。
  • 文件所需权限:用户对该文件至少有r、w权限。

四、让用户可以建立文件的基本权限

  • 目录所需权限:用户在该目录要至少有w、x权限。

五、让用户进入某目录并执行该目录下的某个指令的基本权限

  • 目录所需权限:用户在该目录至少有x的权限。
  • 文件所需权限:用户对该文件至少有x的权限。

例题

  • 用户xiang能进行cp /dir1/file1 /dir2,说明dir1、file1、dir2最小所需权限。
    执行cp时,xiang要能读取源文件、写入目标文件:
    dir1:至少有x权限;
    file1:至少有r权限;
    dir2:至少有w、x权限。

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1

Welcome to my github: https://github.com/gaoxiangnumber1

你可能感兴趣的:(github,shell,管理)