linux中bash的基础特性和基本文件管理命令

linux的文件管理类命令

linux系统下的涉及到目录管理命令,主要有 mkdir,rmdir

linux系统下也会用到许多文件查看类命令,包括cat,tac,head,tail,more,less

linux系统下涉及的文件管理类命令主要有cp,mv,rm

本节我们主要说明文件管理类命令的使用方法。

cp命令的使用方法

首先,cp这个命令的作用是可以复制文件或目录,且支持多个文件同时复制。

cp命令的语法格式:

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

单源复制:cp [OPTION]…SOURCE DEST

  • 如果dest文件不存在则创建文件,并复制源文件数据流到DEST文件中(这里源,目的都是文件)

  • 如果dest文件存在,则复制源文件数据覆盖目标文件(这里源,目标都是文件)

  • 如果dest是一个目录,则在dest目录中创建相同的文件和内容(这里源是文件,目的是目录)

  • 如果源是目录,需要加选项-t,这这时候dest必须是目录,将其源目录下所有文件复制到目标目录下!

多源复制:cp [OPTION]… SOURCE… DIRECTORY

  • 多源复制的目标必须是目录

  • 可以复制多个文件,到同一个目录下。

常用选项option:

  • -i:覆盖之前提醒用户确认 。cp的别名就是cp -i

  • -f:强制覆盖目标文件

  • -r:递归复制目录,复制目录和目录中的内容到目标位置

  • -d:复制一个符号链接本身,不会其指向的真正的源文件。

  • -a: 表示连源文件源文件属性都复制过去

  • –preserv=

    • mode 权限

    • ownership 属主属组

    • timestamps:时间戳

    • context:安全标签

    • xattr:扩展属性

    • links:符号链接

    • all:所有文件

示例:

[root@localhost ~]# cat cpdoc.txt
Are you kidding me ?

I 'm angry!
[root@localhost ~]# cat cpdoc1.txt
no, i am not 
 I'am sorry~
[root@localhost ~]# cp cpdoc1.txt cpdoc2.txt
[root@localhost ~]# cat cpdoc2.txt
no, i am not 
 I'am sorry~
[root@localhost ~]# cp cpdoc.txt cpdoc1.txt
cp: overwrite `cpdoc1.txt'? Y
[root@localhost ~]# cat cpdoc1.txt
Are you kidding me ?

I 'm angry!
[root@localhost ~]# cp cpdoc.txt cpdoc1.txt hahaha
[root@localhost ~]# ls hahaha
cpdoc1.txt  cpdoc.txt  text.txt
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# cp hahaha -r test
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# tree test
test
|-- 1p2a
|-- 28pa
|-- Pa99
|-- hahaha
|   |-- cpdoc.txt
|   |-- cpdoc1.txt
|   `-- text.txt
|-- p,a
|-- pa
|-- pa12
`-- papi

1 directory, 10 files

[root@localhost ~]# cp --preserv=mode cpdoc.txt test
[root@localhost ~]# ls -l test/cpdoc.txt
-rw-r--r-- 1 root root 34 Sep 25 01:05 test/cpdoc.txt
[root@localhost ~]# ls -l cpdoc.txt
-rw-r--r-- 1 root root 34 Sep 25 00:46 cpdoc.txt
[root@localhost ~]#

mv的使用方法

mv和cp使用方式基本一样,只是mv命令完成cp操作之后,会把原来的source文件删除。
注意:mv一个目录时不需要加-r选项即可实现递归移动

命令格式:

SYNOPSIS
       mv [OPTION]... [-T] SOURCE DEST
       mv [OPTION]... SOURCE... DIRECTORY
       mv [OPTION]... -t DIRECTORY SOURCE...

常用选项:

  • -i:交互式;

  • -f:force

示例:

[root@localhost ~]# tree test
test
|-- 1p2a
|-- 28pa
|-- Pa99
|-- cpdoc.txt
|-- hahaha
|   |-- cpdoc.txt
|   |-- cpdoc1.txt
|   `-- text.txt
|-- p,a
|-- pa
|-- pa12
`-- papi

1 directory, 11 files

[root@localhost ~]# mv test/1p2a test/hahaha
[root@localhost ~]# tree test
test
|-- 28pa
|-- Pa99
|-- cpdoc.txt
|-- hahaha
|   |-- 1p2a
|   |-- cpdoc.txt
|   |-- cpdoc1.txt
|   `-- text.txt
|-- p,a
|-- pa
|-- pa12
`-- papi

1 directory, 11 files

[root@localhost ~]# mv test/hahaha test/mvtest
[root@localhost ~]# tree test
test
|-- 28pa
|-- Pa99
|-- cpdoc.txt
|-- mvtest
|   |-- 1p2a
|   |-- cpdoc.txt
|   |-- cpdoc1.txt
|   `-- text.txt
|-- p,a
|-- pa
|-- pa12
`-- papi

1 directory, 11 files
[root@localhost ~]#

rm的用法

rm主要是做命令删除用的,删除操作非常危险,linux系统无回收站。可以不用这个命令,只是将其mv到某个位置。

语法:

SYNOPSIS
       rm [OPTION]... FILE...

常用选项:

  • -i:交互式

  • -r:递归操作

  • -f:强制操作

[root@localhost ~]# rm /tmp/
.esd/                   .gdm_socket             issue                   keyring-pDpnGb/         mysysroot/              virtual-root.0ghOid/    .X0-lock
.font-unix/             .gdmZYIZNY              issue.tee               keyring-TNKNhD/         test.1363               virtual-root.pLN0g0/    .X11-unix/
functions               grub.conf               keyring-0QvdsM/         keyring-VIDgg7/         test.1365               VMwareDnD/              
gconfd-root/            hahaha/                 keyring-LcHTXN/         mapping-chenjianhang    test.1413               vmware-root/            
.gdm5PIVNY              .ICE-unix/              keyring-nhUcNx/         mapping-root            test.etc                vmware-root-2084385593/ 

[root@localhost ~]# rm -r /tmp/hahaha
rm: descend into directory `/tmp/hahaha'? y
rm: remove regular empty file `/tmp/hahaha/text.txt'? 
[root@localhost ~]# ls /tmp
functions    hahaha     keyring-0QvdsM  keyring-pDpnGb  mapping-chenjianhang  test.1363  test.etc             VMwareDnD
gconfd-root  issue      keyring-LcHTXN  keyring-TNKNhD  mapping-root          test.1365  virtual-root.0ghOid  vmware-root
grub.conf    issue.tee  keyring-nhUcNx  keyring-VIDgg7  mysysroot             test.1413  virtual-root.pLN0g0  vmware-root-2084385593
[root@localhost ~]#

bash的工作特性之命令执行状态返回值

bash通过状态返回值来输入命令的执行结果

成功:0

失败:1-255

命令执行完成后,状态返回值保存在bash的特殊变量中.

演示内容:

[root@localhost ~]# ls
06:13:04  2016             a.out  asasx.txt   cpdoc2.txt  Desktop  grep.txt  install.log         like.txt  qq       qq.save.1  test     Thu
15        anaconda-ks.cfg  asas   cpdoc1.txt  cpdoc.txt   grep     hahaha    install.log.syslog  PDT       qq.save  Sep        testdir  vimtext
[root@localhost ~]# echo $?
0
[root@localhost ~]# lss
-bash: lss: command not found
[root@localhost ~]# echo $?
127
[root@localhost ~]# cd /xasmxaiosjxo
-bash: cd: /xasmxaiosjxo: No such file or directory
[root@localhost ~]# echo $?
1
[root@localhost ~]#

需要注意,bash只能获取最近一次状态结果。

bash的工作特性之命令行展开

  • ~:自动展开为用户的家目录,或指定用户的家目录

  • {}:可承载一个逗号分隔的路径列表,并能将其展开为多个路径

示例:

[root@localhost ~]# cd /tmp
[root@localhost tmp]# cd ~
[root@localhost ~]# pwd
/root
[root@localhost ~]#

创建/tmp目录下的:a_c,a_d,b_c,b_d

[root@localhost ~]# ls -a /tmp
.           functions    .gdmZYIZNY  issue           keyring-nhUcNx  mapping-chenjianhang  test.1365            virtual-root.pLN0g0     .X0-lock
..          gconfd-root  grub.conf   issue.tee       keyring-pDpnGb  mapping-root          test.1413            VMwareDnD               .X11-unix
.esd        .gdm5PIVNY   hahaha      keyring-0QvdsM  keyring-TNKNhD  mysysroot             test.etc             vmware-root
.font-unix  .gdm_socket  .ICE-unix   keyring-LcHTXN  keyring-VIDgg7  test.1363             virtual-root.0ghOid  vmware-root-2084385593
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# touch /tmp/{a,b}_{c,d}
[root@localhost ~]# ls -a /tmp
.    b_c         functions    .gdmZYIZNY  issue           keyring-nhUcNx  mapping-chenjianhang  test.1365            virtual-root.pLN0g0     .X0-lock
..   b_d         gconfd-root  grub.conf   issue.tee       keyring-pDpnGb  mapping-root          test.1413            VMwareDnD               .X11-unix
a_c  .esd        .gdm5PIVNY   hahaha      keyring-0QvdsM  keyring-TNKNhD  mysysroot             test.etc             vmware-root
a_d  .font-unix  .gdm_socket  .ICE-unix   keyring-LcHTXN  keyring-VIDgg7  test.1363             virtual-root.0ghOid  vmware-root-2084385593
[root@localhost ~]#

创建/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
  [root@localhost ~]# mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,user/local/{bin,sbin},var/{lock,log,run}}
  mkdir: created directory `/tmp/mylinux'
  mkdir: created directory `/tmp/mylinux/bin'
  mkdir: created directory `/tmp/mylinux/boot'
  mkdir: created directory `/tmp/mylinux/boot/grub'
  mkdir: created directory `/tmp/mylinux/dev'
  mkdir: created directory `/tmp/mylinux/etc'
  mkdir: created directory `/tmp/mylinux/etc/rc.d'
  mkdir: created directory `/tmp/mylinux/etc/rc.d/init.d'
  mkdir: created directory `/tmp/mylinux/etc/sysconfig'
  mkdir: created directory `/tmp/mylinux/etc/sysconfig/network-scripts'
  mkdir: created directory `/tmp/mylinux/lib'
  mkdir: created directory `/tmp/mylinux/lib/modules'
  mkdir: created directory `/tmp/mylinux/lib64'
  mkdir: created directory `/tmp/mylinux/proc'
  mkdir: created directory `/tmp/mylinux/sbin'
  mkdir: created directory `/tmp/mylinux/sys'
  mkdir: created directory `/tmp/mylinux/tmp'
  mkdir: created directory `/tmp/mylinux/user'
  mkdir: created directory `/tmp/mylinux/user/local'
  mkdir: created directory `/tmp/mylinux/user/local/bin'
  mkdir: created directory `/tmp/mylinux/user/local/sbin'
  mkdir: created directory `/tmp/mylinux/var'
  mkdir: created directory `/tmp/mylinux/var/lock'
  mkdir: created directory `/tmp/mylinux/var/log'
  mkdir: created directory `/tmp/mylinux/var/run'
  [root@localhost ~]# tree /tmp/mylinux
  /tmp/mylinux
  |-- bin
  |-- boot
  |   `-- grub
  |-- dev
  |-- etc
  |   |-- rc.d
  |   |   `-- init.d
  |   `-- sysconfig
  |       `-- network-scripts
  |-- lib
  |   `-- modules
  |-- lib64
  |-- proc
  |-- sbin
  |-- sys
  |-- tmp
  |-- user
  |   `-- local
  |       |-- bin
  |       `-- sbin
  `-- var
      |-- lock
      |-- log
      `-- run

  24 directories, 0 files
  [root@localhost ~]#

文件的元数据信息

文件的数据有2类:数据本身和元数据,元数据相当于对文件的一个摘要,通过stat命令可以查看文件的元数据。

例子:

[root@localhost ~]# stat /tmp/mylinux
  File: `/tmp/mylinux'
  Size: 4096            Blocks: 16         IO Block: 4096   directory
Device: 802h/2050d      Inode: 784934      Links: 14
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-25 02:19:22.000000000 -0700
Modify: 2016-09-25 02:19:05.000000000 -0700
Change: 2016-09-25 04:02:05.000000000 -0700
[root@localhost ~]#

主要显示了以下内容:

  • 文件名

  • 文件大小

  • 文件块

  • 文件类型

  • 文件链接数

  • 文件权限

  • UID

  • GID

  • 文件最后一次被查看的时间

  • 文件数据最后一次被修改的时间

  • 文件数据和元数据最后一次被改动的时间

通过touch命令可以改变文件的时间戳,touch命令的用法如下:

  • -c:指定文件不存在时不予以创建

  • -a:只改访问时间access time

  • -m:只改更改时间modify time

  • -t:指定改成什么时间,年月日时分.秒

      [root@localhost ~]# stat  /tmp/mylinux
        File: `/tmp/mylinux'
        Size: 4096            Blocks: 16         IO Block: 4096   directory
      Device: 802h/2050d      Inode: 784934      Links: 14
      Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
      Access: 2016-09-25 02:19:22.000000000 -0700
      Modify: 2016-09-25 02:19:05.000000000 -0700
      Change: 2016-09-25 04:02:05.000000000 -0700
      [root@localhost ~]# touch -a /tmp/mylinux
      [root@localhost ~]# stat  /tmp/mylinux
        File: `/tmp/mylinux'
        Size: 4096            Blocks: 16         IO Block: 4096   directory
      Device: 802h/2050d      Inode: 784934      Links: 14
      Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
      Access: 2016-09-25 08:12:44.000000000 -0700
      Modify: 2016-09-25 02:19:05.000000000 -0700
      Change: 2016-09-25 08:12:44.000000000 -0700
      [root@localhost ~]# touch -m /tmp/mylinux
      [root@localhost ~]# stat  /tmp/mylinux
        File: `/tmp/mylinux'
        Size: 4096            Blocks: 16         IO Block: 4096   directory
      Device: 802h/2050d      Inode: 784934      Links: 14
      Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
      Access: 2016-09-25 08:12:44.000000000 -0700
      Modify: 2016-09-25 08:13:26.000000000 -0700
      Change: 2016-09-25 08:13:26.000000000 -0700
      [root@localhost ~]# touch  -mt 201011111111.11 /tmp/mylinux
      [root@localhost ~]# stat  /tmp/mylinux
        File: `/tmp/mylinux'
        Size: 4096            Blocks: 16         IO Block: 4096   directory
      Device: 802h/2050d      Inode: 784934      Links: 14
      Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
      Access: 2016-09-25 08:12:44.000000000 -0700
      Modify: 2010-11-11 11:11:11.000000000 -0800
      Change: 2016-09-25 08:15:31.000000000 -0700
      [root@localhost ~]#

    注意:文件中任何信息改动了,change time肯定会变动,包括数据本身和元数据。

如何定义一个命令别名

通过alias命令可以定义和查看命令的别名,别名也可以与原名相同,也可以通过/COMMAND运行原名。

如果不想继续用别名,可以通过unalias取消别名。

这里下面定义的别名只在本次bash进程中有效,如果想永久的定义别名,需要在配置文件/etc/bashrc或者用户家目录下的bashrc.d中设置。

[root@localhost ~]# clr
-bash: clr: command not found
[root@localhost ~]# 
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# alias clr='clear'
[root@localhost ~]# alias
alias clr='clear'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# clr
[root@localhost ~]#

如何在命令中引用一个命令的执行结果

可以通过$(COMMAND)或者$'COMMAND'方式引用命令的执行结果

[root@localhost ~]# echo $(date +%Y)
2016
[root@localhost ~]# mkdir $(date +%Y)
[root@localhost ~]# ls
??。??????  anaconda-ks.cfg  asasx.txt   cpdoc.txt  grep.txt     install.log.syslog  qq         Sep      Thu
06:13:04    a.out            cpdoc1.txt  Desktop    hahaha       like.txt            qq.save    test     vimtext
2016        asas             cpdoc2.txt  grep       install.log  PDT                 qq.save.1  testdir
[root@localhost ~]#

globbing文件通配

显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。

[root@localhost ~]# ls /var/1*[[:digit:]]*[[:lower:]]
/var/1text2x
[root@localhost ~]# ls /var/1*[0-9]*[a-z]
/var/1text2x
[root@localhost ~]#

显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。

[root@localhost ~]# ls /etc/[[:digit:]]*[^[:digit:]]
/etc/2xaskm
[root@localhost ~]#

显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。

[root@localhost ~]# ls /etc/[^[:alpha:]]*
/etc/2xaskm
[root@localhost ~]#

在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。

[root@localhost ~]# touch /tmp/tfile-$(date "+%G-%m-%d-%k-%M-%S")
[root@localhost ~]# ls /tmp
a_c        gconfd-root  keyring-0QvdsM  keyring-VIDgg7        test.1363                  virtual-root.0ghOid
a_d        grub.conf    keyring-LcHTXN  mapping-chenjianhang  test.1365                  virtual-root.pLN0g0
b_c        hahaha       keyring-nhUcNx  mapping-root          test.1413                  VMwareDnD
b_d        issue        keyring-pDpnGb  mylinux               test.etc                   vmware-root
functions  issue.tee    keyring-TNKNhD  mysysroot             tfile-2016-09-25-19-09-26  vmware-root-2084385593
[root@localhost ~]#

复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。

[root@localhost ~]# cp -R /etc/p*[^[:digit:]]  /tmp/mytest1

复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。

[root@localhost ~]# cp -R /etc/*.d  /tmp/mytest2

复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

[root@localhost ~]# cp -R /etc/[1mn]*.conf  /tmp/mytest3
[root@localhost ~]#

原创文章,作者:Theo,如若转载,请注明出处:http://www.178linux.com/49109

评论列表(1条)

  • luoweiro
    luoweiro 2016-10-10 22:48

    总结的非常的详细