第二周
1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
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 tmp]# cd /tmp [root@localhost tmp]# cp /var/log/wtmp . [root@localhost tmp]# ls -l /var/log/wtmp wtmp -rw-rw-r--. 1 root utmp 10368 Mar 30 21:37 /var/log/wtmp -rw-r--r-- 1 root root 10368 Mar 30 21:50 wtmp [root@localhost tmp]# |
注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变,这是个很重要的特性。还有连文件建立的时间也不一样了。
那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -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 10368 Mar 30 21:37 /var/log/wtmp -rw-rw-r--. 1 root utmp 10368 Mar 30 21:37 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 [root@localhost tmp]# |
还是要再次的强调, -r 是可以复制目录,但是,文件与目录的权限可能会被改变,所以也可以利用cp -a /etc /tmp 来下达指令,尤其是在备份的情况下。
- 示例4:将示例1复制的 bashrc 建立一个符号链接文件 (symbolic link)
[root@localhost tmp]# ls -l bashrc -rw-r--r-- 1 root root 10368 Mar 30 21:50 bashrc [root@localhost tmp]# cp -s bashrc bashrc_slink [root@localhost tmp]# ls -l bashrc* -rw-r--r-- 1 root root 10368 Mar 30 21:50 bashrc -rw-rw-r--. 1 root utmp 10368 Mar 30 21:37 bashrc_2 lrwxrwxrwx 1 root root 4 Mar 30 21:58 bashrc_slink -> bashrc [root@localhost tmp]# |
使用-s 则是符号链接(symboliclink), 简单来说,bashrc_slink 是一个『快捷方式』,这个快捷方式会连结到 bashrc去!所以你会看到bashrc_slink右侧会有个指向(->)的符号。
- 示例5:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@localhost tmp]# cp -u ~/.bashrc /tmp/ |
这个 -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 tmp]# cp -a /var/log/wtmp /tmp/test_wtmp [root@localhost tmp]# ls -l /var/log/wtmp /tmp/test_wtmp -rw-rw-r--. 1 test test 10368 Mar 30 21:37 /tmp/test_wtmp -rw-rw-r--. 1 root utmp 10368 Mar 30 21:37 /var/log/wtmp [root@localhost tmp]# |
由于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 tmp]# cd /tmp [root@localhost tmp]# rm -i bashrc rm: remove regular file 'bashrc'? y [root@localhost tmp]# |
如果加上 -i 的选项就会主动询问,避免你删除到错误的文件或目录
- 示例2:将 cp 示例中所建立的 /tmp/etc/ 这个目录删除掉,若没有就先复制/etc到/tmp/etc
[root@localhost tmp]# mkdir /tmp/etc mkdir: cannot create directory '/tmp/etc': File exists [root@localhost tmp]# rm -r /tmp/etc rm: descend into directory '/tmp/etc'? y rm: remove regular file '/tmp/etc/fstab'? y rm: remove regular empty file '/tmp/etc/crypttab'? ^C [root@localhost tmp]# |
…..(中间省略)…..
因为身份是 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 Mar 30 22:11 -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- |
2、使用命令行展开功能,创建/tmp/a1, /tmp/a2, /tmp/a1/a, /tmp/a1/b,在/tmp目录下创建目录:x_y, x_z, q_y, q_z
创建/tmp/a1, /tmp/a2, /tmp/a1/a, /tmp/a1/b,可使用如下命令
mkdir -p /tmp/a{1,2} /tmp/a1/{a,b} ;
[root@localhost tmp]# mkdir -p /tmp/a{1,2} /tmp/a1/{a,b} [root@localhost a1]# tree /tmp /tmp ├── - ├── a1 │ ├── a │ └── b ├── a2 |
在/tmp目录下创建目录:x_y, x_z, q_y, q_z 使用命令如下:
mkdir -p /tmp/{x,q}_{y,z}
[root@localhost tmp]# mkdir -p /tmp/tmp/{x,q}_{y,z} [root@localhost tmp]# tree tmp tmp [error opening dir]
0 directories, 0 files [root@localhost tmp]# tree /tmp/tmp /tmp/tmp ├── q_y ├── q_z ├── x_y └── x_z |
3、文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。
1)文件的元数据信息及查看
文件的数据分两种:一种元数据,既属性数据;一种就是数据本身;可使用stat命令查看文件的元数据:
例如:
[root@localhost ~]# stat /etc/passwd File: '/etc/passwd' Size: 2301 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 34977988 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-29 23:34:27.380999819 +0800 Modify: 2019-03-02 16:27:08.322666097 +0800 Change: 2019-03-02 16:27:08.323666128 +0800 Birth: - |
其中:
file:文件名;size:文件大小;block:文件占了多少个数据块;IO Block:文件所占数据块的块大小;
Device:硬件,既说明该文件在硬盘的那个柱面;Inode:节点号;links:链接;Access(第一个):权限;
Uid:该文件所属的属主;Gid:该文件所属的属组;context:安全上下文;
Access(第二个):文件上一次的访问时间;
Modify:文件上一次修改的时间;
Change:文件上一次属性更改的时间;
2)修改文件的时间戳信息:
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。:
语法:
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
常用选项:
-a 只更改访问时间 -c, --no-create 不创建任何文件 -d, --date=字符串 使用指定字符串表示时间而非当前时间 -f (忽略) -h, --no-dereference 会影响符号链接本身,而非符号链接所指示的目的地 (当系统支持更改符号链接的所有者时,此选项才有用) -m 只更改修改时间 -r, --reference=FILE use this file's times instead of current time -t 使用指定的日期时间 use [[CC]YY]MMDDhhmm[.ss] instead of current time --time=WORD change the specified time: WORD is access, atime, or use: equivalent to -a WORD is modify or mtime: equivalent to -m --help 显示此帮助信息并退出 --version 显示版本信息并退出 |
示例:
[root@localhost tmp]# stat wtmp File: 'wtmp' Size: 10368 Blocks: 24 IO Block: 4096 regular file Device: fd00h/64768d Inode: 33558401 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-30 21:50:46.165951959 +0800 Modify: 2019-03-30 21:50:46.165951959 +0800 Change: 2019-03-30 21:50:46.165951959 +0800 Birth: - [root@localhost tmp]# touch -t 01011000 wtmp [root@localhost tmp]# stat wtmp File: 'wtmp' Size: 10368 Blocks: 24 IO Block: 4096 regular file Device: fd00h/64768d Inode: 33558401 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-01-01 10:00:00.000000000 +0800 //可以看到访问时间和修改时间都进行了修改 Modify: 2019-01-01 10:00:00.000000000 +0800 Change: 2019-03-30 22:38:26.075798564 +0800 //因为文件属性包含时间属性,所以更改时间变为当时时间 Birth: - [root@localhost tmp]# |
4、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
touch /tmp/tfile-$(date +%Y-%m-%d-%H-%M-%S
[root@localhost tmp]# touch /tmp/tfile-$(date +%Y-%m-%d-%H-%M-%S) [root@localhost tmp]# tree /tmp /tmp └── tfile-2019-03-30-22-42-17 0 directories, 1 file [root@localhost tmp]# |
5、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
[root@localhost tmp]# mkdir /tmp/mytest1 [root@localhost tmp]# cp -r /tmp/p*[^0-9] /tmp/mytest1 cp: cannot stat '/tmp/p*[^0-9]': No such file or directory [root@localhost tmp]# |
6、创建用户tom,指定UID为5001,指定家目录为/tmp/tom, 指定shell为/bin/zsh, 指定基本组为tom,附加组为jack
[root@localhost tmp]# groupadd jack [root@localhost tmp]# useradd tom -u 5001 -d /tmp/tom -s /bin/zsh -G jack [root@localhost tmp]# id tom uid=5001(tom) gid=5001(tom) groups=5001(tom),1001(jack) [root@localhost tmp]# |
useradd参数说明: -c<备注> 加上备注文字。备注文字会保存在passwd的备注栏位中。 -d<登入目录> 指定用户登入时的启始目录。 -D 变更预设值. -e<有效期限> 指定帐号的有效期限。 -f<缓冲天数> 指定在密码过期后多少天即关闭该帐号。 -g<群组> 指定用户所属的群组。 -G<群组> 指定用户所属的附加群组。 -m 自动建立用户的登入目录。 -M 不要自动建立用户的登入目录。 -n 取消建立以用户名称为名的群组. -r 建立系统帐号。 -s<shell>指定用户登入后所使用的shell。 -u<uid> 指定用户ID。 |