1.Linux上的文件管理类命令,其常用的使用方法及其相关示例演示
文件与目录的管理上,不外乎显示属性、 拷贝、删除文件及移动文件或目录等等,由于文件与目录的管理在 Linux 当中是很重要的, 尤其是每个人自己家目录的数据也都需要注意管理,所以我们来谈一谈有关文件与目录的一些基础管理部分!
分三部分逐步了解:文件查看类命令、文件管理类命令、目录管理类命令
第一部分:文件查看类命令
cat命令一次性连续显示
cat:文本文件查看工具;cat是由第一行到最后一行一次性连续显示在屏幕上。
使用语法:cat [OPTION]… [FILE]…
选项:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已; -b :列出行号,仅针对非 空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
示例:常用选项-n的示例:
[root@localhost ~]# cat -n /etc/man_db.conf
1 #
2 #
3 # This file is used by the man-db package to configure the man and cat paths.
4 # It is also used to provide a manpath for those without one by examining
5 # their PATH environment variable. For details see the manpath(5) man page.
中间省略
129 # Flags.
130 # NOCACHE keeps man from creating cat pages.
131 #NOCACHE
注意:一次性将内容全部显示出来,如果内容过多会造成无法找到初始行。
tac命令
tac:文本文件查看工具:tac是由最后一行到第一行反向在屏幕上显示出来,tac的选项功能与cat相同
more命令按百分比逐步显示
more:文本文件查看工具,将大文件按百分比逐步显示,并且在显示界面可以使用快捷键浏览内容
使用语法:more FILE
选项:
空格键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只在文件未全部显示时可用,文件全部显示后自动退出
示例:
[root@localhost ~]# more /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
屏幕中间内容省略
MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
MANPATH_MAP /usr/games /usr/share/man
–More–(29%)
当前屏幕最后一行会显示出目前显示内容的百分比, 而且还可以在最后一行输入一些有用的指令。
注意:翻屏至文件尾部后自动退出;
less命令比起 more 更加的有弹性
less:文本文件查看工具,less 的用法比起 more 更加的有弹性.
使用语法:less FILE
选项:
空格键 :向下翻动一页
[pagedown]:向下翻动一页
[pageup] :向上翻动一页
/字符串 :向下搜寻『字符串』的功能
?字符串 :向上搜寻『字符串』的功能
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
g :前进到这个资料的第一行去
G :前进到这个数据的最后一行去 (注意大小写)
#G : 跳转至指定行;
1G :跳转至文件首部
q :离开 less 这个程序
使用方法与more形同这里就不做示例了。
注意:使用less在屏幕底部不会显示出目前显示内容的百分比,而是显示文件名。
head命令显示文件前面几行
head命令:文本文件查看工具,显示文件前面几行,默认显示前面10行。
使用语法:head [options] FILE
选项:
-n # ;#代表行数
-# ;功能=-n #
-n -#: 除此文件后面的#行外其他内容都显示。
示例:
[root@localhost ~]# head -4 /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
tail命令显示文件后面几行
tail命令:文本文件查看工具,显示文件后面几行,默认显示后面10行。
使用语法:tail [options] FILE
选项:
-n # ;#代表行数
-# ;功能=-n #
-n +#: 只想显示此文件#行以后的内容(含#行)。
-f:查看文件尾部内容结束后不退出,使用Ctrl+c键退出。跟随显示新增的行;可以利用此命令监控实时的日志文件。比如一个运行中的程序的日志,此日志文件是实时增加内容的,可以使用此命令跟踪日志输出信息。
注意:在使用-f选项时,只能使用-n #来选择行数。
示例:要显示 /etc/man_db.conf 的第 16 到第 20 行
[root@localhost ~]# head -n 20 /etc/man_db.conf | tail -5
# every automatically generated MANPATH includes these fields
#
#MANDATORY_MANPATH /usr/src/pvm3/man
#
MANDATORY_MANPATH /usr/man
stat命令查看文件的元数据
stat命令: 使用stat 查看到的文件的信息是文件的元数据
文件的数据分为两类:一类为数据,即文件的实际内容;另一类为元数据,用来描述文件属性的数据。
使用语法:stat FILE…
示例:查看/etc/passwd文件的元数据
[root@localhost ~]# stat /etc/passwd
文件:”/etc/passwd”
大小:1309 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:134938285 硬链接:1
权限:(0644/-rw-r–r–) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:passwd_file_t:s0
最近访问:2018-08-20 12:35:01.738182124 +0800
最近更改:2017-01-11 16:28:45.744639498 +0800
最近改动:2017-01-11 16:28:45.747639498 +0800
创建时间:-
第二部分:文件管理类命令
cp命令复制文件或目录
cp命令:复制文件和目录
使用语法:
单源复制:cp [OPTION]… SOURCE DEST
多源复制:cp [OPTION]… SOURCE… DIRECTORY
单源复制:cp [OPTION]… [-T] SOURCE DEST
如果DEST不存在:则事先创建DEST文件,并复制源文件的数据流至DEST中;
如果DEST存在:
如果DEST是非目录文件:则覆盖目标文件数据;
如果DEST是目录文件:则先在DEST目录下创建一个与源文件同名的文件,并复制其数据流
如果源和DEST是目录且在使用-r选项后:
如果DEST不存在:
则先在DEST路径创建DEST目录,在将源目录的所有文件复制到DEST目录中
如果DEST存在:
则先在DEST目录下创建一个与源目录同名的目录,并将源目录中的所有文件复制到新创建的目录中;
多源复制:cp [OPTION]… SOURCE… DIRECTORY
如果DEST不存在(无论源是文件还是目录):提示错误;且不能自动创建目录
[root@localhost ~]# cp /etc/{fstab,issue} /tmp/test.txt/
cp: 目标”/tmp/test.txt/” 不是目录
如果DEST存在:
如果DEST是非目录文件:提示错误;
如果DEST是目录文件:分别复制每个文件至目标目录中,并保持原名;
选项:
-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 等也复制了。
–preserve=
mode:权限
ownership:属主和属组
timestamps: 时间戳
context:安全标签
xattr:扩展属性
links:符号链接
all:上述所有属性
示例1:用 root 身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
[root@localhost ~]# cp ~/.bashrc /tmp/bashrc
[root@localhost ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc’? n n <==n 不覆盖,y 为覆盖
重复作两次动作,由于 /tmp 底下已经存在 bashrc 了,加上 -i 选项后,
则在覆盖前会询问使用者是否确定,可以按下 n 或者 y 来二次确认。
示例2:变换目录到/tmp,并将/var/log/wtmp 复制到/tmp 且观察属性:
[root@localhost ~]# cd /tmp
[root@localhost tmp]# cp /var/log/wtmp . 想要复制到当前目录,最后的 . 不要忘
[root@localhost tmp]# ls – l /var/log/wtmp wtmp
-rw-rw-r–. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-r–r–. 1 root root 28416 Jun 11 19:01 wtmp
注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变,这是个很重要的特性。还有连文件建立的时间也不一样了。
那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a ,如下所示:
[root@localhost tmp]# cp – a /var/log/wtmp wtmp_2
[root@localhost tmp]# ls – l /var/log/wtmp wtmp_2
-rw-rw-r–. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r–. 1 root utmp 28416 Jun 11 18:56 wtmp_2
整个资料特性完全一模一样。
这个 cp 的功能很多,由于我们常常会进行一些数据的复制,所以也会常常用到这个指令的。 一般来说,我们如果去复制别人的数据 (当然,该文件你必须要有 read 的权限才行) 时, 总是希望复制到的数据最后是我们自己的,所以,在预设的条件中, cp 的源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。举例来说,上面的示例2中,由于我是 root 的身份,因此复制过来的文件拥有者与群组就改变成为 root 所有了!
由于具有这个特性,当我们在进行备份的时候,某些需要特别注意的特殊权限文件, 例如密码文件 (/etc/shadow) 以及一些配置文件,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等可以完整复制文件权限的选项才行。另外,如果你想要复制文件给其他的使用者, 也必须要注意到文件的权限(包含读、写、执行以及文件拥有者等等), 否则,其他人还是无法针对你给予的文件进行修改的动作。
示例3:复制 /etc/ 这个目录下的所有内容到 /tmp 底下
[root@localhost tmp]# cp /etc/ /tmp
cp: omitting directory `/etc’ 如果是目录则不能直接复制,要加上 -r 的选项
[root@localhost tmp]# cp – r /etc/ /tmp
还是要再次的强调, -r 是可以复制目录,但是,文件与目录的权限可能会被改变,所以也可以利用cp -a /etc /tmp 来下达指令,尤其是在备份的情况下。
示例4:将示例1复制的 bashrc 建立一个符号链接文件 (symbolic link)
[root@localhost tmp]# ls – l bashrc
-rw-r–r–. 1 root root 176 Jun 11 19:01 bashrc 先观察一下文件情况
[root@localhost tmp]# cp – s bashrc bashrc_slink
[root@localhost tmp]# ls – l bashrc*
-rw-r–r–. 1 root root 176 Jun 11 19:01 bashrc
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
使用-s 则是符号链接(symboliclink), 简单来说,bashrc_slink 是一个『快捷方式』,这个快捷方式会连结到 bashrc 去!所以你会看到bashrc_slink右侧会有个指向(->)的符号。
示例5:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@localhost tmp]# cp – u ~/.bashrc /tmp/bashrc
这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。
所以,比较常被用于备份的工作当中。
示例6:将示例4创建的 bashrc_slink 复制成为 bashrc_slink_1 与 bashrc_slink_2
[root@localhost tmp]# cp bashrc_slink bashrc_slink_1
[root@localhost tmp]# cp – d bashrc_slink bashrc_slink_2
[root@localhost tmp]# ls – l bashrc bashrc_slink*
-rw-r–r–. 2 root root 176 Jun 11 19:01 bashrc
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
-rw-r–r–. 1 root root 176 Jun 11 19:09 bashrc_slink_1 与源文件相同
lrwxrwxrwx. 1 root root 6 Jun 11 19:10 bashrc_slink_2 -> bashrc 是符号链接文件
原本复制的是符号链接文件,但是却将符号链接文件所指向的实际文件复制过来了,也就是说,如果没有加上任何选项时,cp 复制的是源文件,而非符号链接文件的本身。若要复制符号链接文件本身,就得要使用 -d 的选项了。如 bashrc_slink_2 所示。
示例7:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下
[root@localhost tmp]# cp ~/.bashrc ~/.bash_history /tmp
可以将多个数据一次复制到同一个目录去,最后面一定是目录。
示例8:能否使test的身份,完整的复制/var/log/wtmp 文件到/tmp 底下,并更名为test_wtmp
[root@localhost ~]$ cp – – a /var/log/wtmp /tmp/test_wtmp
[root@localhost ~]$ ls – – l /var/log/wtmp /tmp/test_wtmp
-rw-rw-r–. 1 test test 28416 6 月 11 18:56 /tmp/test_wtmp
-rw-rw-r–. 1 root utmp 28416 6 月 11 18:56 /var/log/wtmp
由于test的身份并不能随意修改文件的拥有者与群组, 因此虽然能够复制 wtmp 的相关权限与时间等属性, 但是与拥有者、群组相关的,原本test身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的。
总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:
是否需要完整的保留来源文件的信息?
来源文件是否为符号链接文件 (symbolic link file)?
来源档是否为特殊的文件,例如 FIFO, socket 等?
来源文件是否为目录?
mv移动文件或文件重命名命令
mv命令:移动文件或文件重命名
使用语法: mv [OPTION]… SOURCE DEST
mv [OPTION]… SOURCE… DIRECTORY
mv命令还有个好用的用途,可以自己建立一个目录起名“recycle bin”回收站,然后将不用的文件或目录移动到这个回收站中,倘若那天后悔了,可以到里面去找回。
文件重命名:
~]#mv FILE| DIRECTORY FILENAME| DIRECTORYNAME
移动文件:
~]#mv FILE directory将文件移动到指定的目录,实现的原理是:
先创建一个与源文件相同文件名的空文件,并复制源文件的数据流至DEST(目标文件)中,再删除源文件。
选项:
-i:交互式;只有输入y才是确认其他任何字符都是取消操作
-f:force 不想交互,强行覆盖
示例1:将mvtest更名为 mvtest2
[root@localhost tmp]# mv mvtest mvtest2这样就更名了
其实在 Linux还有个rename命令 ,专职进行多个档名的同时更名,并非针对单一档名变更,与 mv 不同。
示例2:复制一文件,建立一目录,将文件移动到目录中
[root@localhost ~]# cd /tmp
[root@localhost tmp]# cp ~/.bashrc bashrc1
[root@localhost tmp]# mkdir mvtest
[root@localhost tmp]# mv bashrc1 mvtest
示例3:再建立两个文件,再全部移动到 /tmp/mvtest2 当中
[root@localhost tmp]# cp ~/.bashrc bashrc2
[root@localhost tmp]# cp ~/.bashrc bashrc3
[root@localhost tmp]# mv bashrc2 bashrc3 mvtest2
注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是目录,意思是说,将所有的数据移动到该目录的意思。
rm删除文件或目录命令
rm命令:删除文件或目录
使用语法:rm [OPTION]… FILE…
选项:
-f :就是 force 的意思,不使用互动模式,不会出现询问讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除!最常用在目录的删除了!这是非常危险的选项
示例1:将刚刚在 cp 的范例中建立的 bashrc 删除掉
[root@localhost ~]# cd /tmp
[root@localhost tmp]# rm -i bashrc
rm: remove regular file `bashrc’? y y
如果加上 -i 的选项就会主动询问,避免你删除到错误的文件或目录
示例2:将 cp 示例中所建立的 /tmp/etc/ 这个目录删除掉,若没有就先复制/etc到/tmp/etc
[root@localhost tmp]# rmdir /tmp/etc
rmdir: failed to remove ‘/tmp/etc’: Directory not empty 删不掉,因为这不是空的目录
[root@localhost tmp]# rm -r /tmp/etc
rm: descend into directory `/tmp/etc’? y y
rm: remove regular file `/tmp/etc/fstab’? y y
rm: remove regular empty file `/tmp/etc/crypttab’? 按下 [crtl]+c 中断
…..(中间省略)…..
因为身份是 root ,预设已经加入了 -i 的选项,所以你要一直按 y 才会删除,如果不想要继续按 y ,可以按下 [ctrl]+c来结束 rm 的工作。这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:
[root@localhost tmp]# \rm -r /tmp/etc
在指令前加上反斜杠,使用rm命令本身。
示例3:删除一个带有 – 开头的文件
[root@study tmp]# touch ./- aaa-这个指令可以建立空文件
[root@study tmp]# ls -l
-rw-r–r–. 1 root root 0 Jun 11 19:22 -aaa-文件大小为 0,所以是空文件
[root@study tmp]# rm -aaa-
rm: invalid option — ‘a’ 因为 “-” 是选项,所以系统误判了!
Try ‘rm ./-aaa-‘ to remove the file `-aaa-‘.新的 bash 有给建议的
Try ‘rm –help’ for more information.
[root@study tmp]# rm ./-aaa-或者[root@study tmp]# rm — -aaa-
第三部分:目录管理类命令
mkdir命令创建目录
mkdir:make directories创建目录
使用语法:mkdir [OPTION]… DIRECTORY…
注意:路径基名方为命令的作用对象;基名之前的路径必须得存在;
例如:mkdir /etc/x/y/z 如果/etc/x不存在 则路径不存在,命令失败
mkdir选项介绍:
-p: 自动按需创建父目录;
~]#mkdir /tmp/x/y/z此时若不存在x和y目录是用-p选项,会自动创建
-v: verbose,显示详细过程;
-m MODE:直接给定权限;
示例1:
[root@localhost ~]# mkdir /tmp/x/y/z
mkdir: 无法创建目录”/tmp/x/y/z”: 没有那个文件或目录
[root@localhost ~]# mkdir -pv /tmp/x/y/z
mkdir: 已创建目录 “/tmp/x”
mkdir: 已创建目录 “/tmp/x/y”
mkdir: 已创建目录 “/tmp/x/y/z”
示例2: 在/tmp目录下建立子目录m和m下的n目录,并且只有n目录的属主有读、写和执行权限,文件属组和其他用户无任何权限
[root@localhost ~]# mkdir –pm /tmp/m/n
[root@localhost ~]# ls -ld /tmp/m/n
drwx——. 2 root root 6 8月 20 13:19 /tmp/m/n
rmdir命令移除空目录
rmdir:remove empty directories移除空目录
使用语法:rmdir [OPTION]… DIRECTORY…
rmdir选项介绍:
-p:删除某目录后,如果其父目录为空,则一并删除之;
-v: 显示过程;
示例:已创建好目录:/tmp/m/n/i
[root@localhost ~]# rmdir -pv /tmp/m/n/i
rmdir: 正在删除目录 “/tmp/m/n/i”
rmdir: 正在删除目录 “/tmp/m/n”
rmdir: 正在删除目录 “/tmp/m”
rmdir: 正在删除目录 “/tmp”
rmdir: 删除目录 “/tmp” 失败: 目录非空
[root@localhost ~]# ls -d /tmp
/tmp
Tree命令树状结构显示目录的层级结构
tree命令:树状结构显示目录的层级结构
tree [options] [directory]
-L level:指定要显示的层级;
[root@localhost ~]# tree显示当前目录结构。
示例1:默认显示全部层级
[root@localhost ~]# tree /tmp/a_c
/tmp/a_c
└── 1212
└── qqww
2 directories, 0 files
示例2:-L的用法
[root@localhost ~]# tree -L 1 /tmp/a_c
/tmp/a_c
└── 1212
1 directory, 0 files
注意:tree命令安装方法:~]# yum install tree
2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
(1)bash命令执行后通过状态返回值来确定执行结果:
成功:返回0
失败:返回1-255
注意,命令执行完成后,其状态返回值保存于bash的特殊变量“$?”中。
示例:
(2)bash命令行展开:
~:自动展开为当前用户的家目录
~USERNAME:自动展开为指定用户的家目录
{}:{}内容可为一个用,隔开的路径列表,将其展开为多个路径
示例:
3、请使用命令行展开功能来完成以下练习:
(1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
(2)、创建/tmp/mylinux目录下的:
mylinux/
├── bin
├── boot
│ └── grub
├── dev
├── etc
│ ├── rc.d
│ │ └── init.d
│ └── sysconfig
│ └── network-scripts
├── lib
│ └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ └── local
│ ├── bin
│ └── sbin
└── var
├── lock
├── log
└── run
4.文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息
1)文件的元数据信息及查看
文件的数据分两种:一种元数据,既属性数据;一种就是数据本身;可使用stat命令查看文件的元数据:
例如:
]# stat /etc/passwd
文件:”/etc/passwd”
大小:2483 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:136755684 硬链接:1
权限:(0644/-rw-r–r–) Uid:( 0/ root) Gid:( 0/ root)
环境:systemu:objectr:passwdfilet:s0
最近访问:2016-09-22 22:07:14.897045766 +0800
最近更改:2016-09-20 18:10:23.223086880 +0800
最近改动:2016-09-20 18:10:23.227086888 +0800
创建时间:-
其中:
file:文件名;
size:文件大小
block:文件占了多少个数据块
IO Block:文件所占数据块的块大小
Device:硬件,既说明该文件在硬盘的那个柱面
Inode:节点号
links:链接
Access(第一个):权限
Uid:该文件所属的属主
Gid:该文件所属的属组
context:安全上下文
Access(第二个):文件上一次的访问时间
Modify:文件上一次修改的时间
Change:文件上一次属性更改的时间
2)修改文件的时间戳信息:
可以使用touch命令更改文件的时间戳:
语法:
touch [OPTION]… FILE…
常用选项:
-c: 指定的文件路径不存在时不予创建;
-a: 仅修改access time;
-m:仅修改modify time;
-t:使用指定的日期时间,而非现在的时间;[[CC]YY]MMDDhhmm[.ss];
5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
引用命令的执行结果使用:$(COMMAND)或COMMAND