第二周

1Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。

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才是确认其他任何字符都是取消操作

-fforce  不想交互,强行覆盖

   

  • 示例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,指定UID5001,指定家目录为/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

   

转载于:https://www.cnblogs.com/qq291035606/p/10629610.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值