Linux shell(一)

赵家小少爷 2019-12-18

Linux shell(一)

浏览Linux文件系统

Linux中最基础也是最必要的一条指令

  cd destination

  cd命令可接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指定目标路径,它将切换到用户主目录。

  destination参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。

   接下来将分别阐述这两种方法。这两者之间的不同对于理解文件系统遍历非常重要。

1. 绝对文件路径

  用户可在虚拟目录中采用绝对文件路径引用目录名。绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。
  绝对文件路径总是以正斜线(/)作为起始,指明虚拟文件系统的根目录。因此,如果要指向usr目录所包含的bin目录下的用户二进制文件,可以使用如下绝对文件路径:
  /usr/bin
  使用绝对文件路径可以清晰表明用户想切换到的确切位置。要用绝对文件路径来切换到文件系统中的某个特定位置,只需在cd命令后指定全路径名:
1 :~$ cd /usr/bin
2 :/usr/bin$
  注意,在上面的例子中,提示符中一开始有一个波浪号(~)。在切换到另一个目录之后,这个波浪号被/usr/bin替代了。CLI提示符正是用它来帮助你跟踪当前所在虚拟目录结构中的位置。波浪号表明shell会话位于你的主目录中。在切换出主目录之后,如果提示符已经进行了相关配置 的话,绝对文件路径就会显示在提示符中。

   pwd命令

pwd命令可以显示出shell会话的当前目录,这个目录被称作当前工作目录。pwd命令的用法如下:

1 :/usr/bin$ pwd
2 /usr/bin
3 :/usr/bin$
  在切换到新的当前工作目录时使用pwd命令,是很好的习惯。因为很多shell命令都是在当前工作目录中操作的,在发出命令之前,你应该始终确保自己处在正确的目录之中。

  可以使用绝对路径文件路径切换到Linux虚拟目录结构中的任何一级:

:/$ cd sys/power
:/sys/power$ pwd
/sys/power
:/sys/power$

  但是如果只是在自己的主目录中工作,经常使用绝对路径的话未免太过冗长,例如,若已经位于目录/home/xiaoyu,在输入下方这样的命令切换到Documents目录就有点繁琐了

/home/Documents

2. 相对文件路径

  相对文件路径允许用户指定一个基于当前位置的目标文件路径。相对文件路径不以代表根目录的正斜线(/)开头,而是以目录名(如果用户准备切换到当前工作目录下的一个目录)或是一个特殊字符开始。假如你位于home目录中,并希望切换到Documents子目录,那你可以使用cd命令加上一个相对文件路径:
:~$ pwd
/home/xiaoyu
:~$ cd Documents/
:~/Documents$ pwd
/home/xiaoyu/Documents
:~/Documents$
  上面的例子并没有使用正斜线(/),而是采用了相对文件路径将当前工作目录从 /home/christine改为/home/christine/Documents,大大减少了输入内容。
  另外,此例中还要注意的是,如果提示符经过配置可以显示出当前工作目录,它就会一直显示波浪号。这表明当前工作目录位于用户home目录之下。

  事实上,在实际工程中,使用绝对路径跟相对路径都没啥讲究,都会互相结合使用。

  返回上一级目录

  返回上一级目录,我们使用双点符(..),表示当前目录的父目录

  双点符在目录层级中移动时非常便利。如果正处在主目录下的Documents目录中,需要切换到主目录下的Downloads目录,可以这么做:

:~$ cd Documents
:~/Documents$ pwd
/home/xiaoyu/Documents
:~/Documents$ cd ../Downloads
:~/Downloads$ pwd
/home/xiaoyu/Downloads
:~/Downloads$

文件和目录列表

  要想知道系统中有哪些文件,可以使用列表命令(ls)

  基本的列表功能

  ls命令最基本的形式会显示当前目录下的文件和目录:

:~$ ls
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  Videos  vmware-tools-distrib  xiaoyu
:~$

  ls命令输出的列表是按字母排序的(按列排序而不是按行来排序)

  ls -F,-F参数的ls命令可以轻松区分文件和目录

1 :~$ ls -F
2 Desktop/  Documents/  Downloads/  examples.desktop  Music/  Pictures/  Public/  Templates/  Videos/  vmware-tools-distrib/  xiaoyu/
3 :~$

  -F参数在目录名后面加了正斜线(/),以方便用户在输出中分辨,在可执行文件的后面加个*号,嗯,我目录中暂时没有可执行文件,以便用户找出可在系统中运行的文件。

  基本的ls命令在某种意义上有点容易让人误解。它显示了当前目录下的文件和目录,但并没有将全部都显示出来。Linux经常采用隐藏文件来保存配置信息。在Linux上,隐藏文件通常是文件名以点号开始的文件。这些文件并没有在默认的ls命令输出中显示出来,因此我们称其为隐藏文件。要把隐藏文件和普通文件及目录一起显示出来,就得用到-a参数。下面是一个带有-a参数的ls命令的例子:

:~$ pwd
/home/xiaoyu
:~$ ls -a
.              .bashrc  Desktop    examples.desktop  .local    .profile                   Videos                .xsession-errors
..             .cache   .dmrc      .gconf            .mozilla  Public                     vmware-tools-distrib  .xsession-errors.old
.bash_history  .compiz  Documents  .gnupg            Music     .sudo_as_admin_successful  .Xauthority
.bash_logout   .config  Downloads  .ICEauthority     Pictures  Templates                  xiaoyu
:~$
  所有以点号开头的隐藏文件现在都显示出来了。注意,有三个以.bash开始的文件。它们是bash shell环境所使用的隐藏文件
   -R参数是ls命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。如果目录很多,这个输出就会很长。以下是-R参数输出的简单例子:

  由于结果太长,我这里就不贴了,建议在目录层级比较少的目录下操作

  显示长列表

  在基本的输出列表中,ls命令并未输出太多每个文件的相关信息。要显示附加信息,另一个常用的参数是-l。-l参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。

:~$ ls -l
total 52
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Desktop
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Documents
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Downloads
-rw-r--r-- 1 xiaoyu xiaoyu 8980 Dec  4 07:46 examples.desktop
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Music
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Pictures
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Public
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Templates
drwxr-xr-x 2 xiaoyu xiaoyu 4096 Dec  5 05:15 Videos
drwxr-xr-x 9 xiaoyu xiaoyu 4096 Feb 20  2019 vmware-tools-distrib
drwxrwxr-x 3 xiaoyu xiaoyu 4096 Dec 11 14:20 xiaoyu
:~$
  这种长列表格式的输出在每一行中列出了单个文件或目录。除了文件名,输出中还有其他有用信息。输出的第一行显示了在目录中包含的总块数。在此之后,每一行都包含了关于文件(或目录)的下述信息:
  •   文件类型,比如目录(d)、文件(-)、字符型文件(c)或块设备(b);
  •   文件的权限
  •   文件的硬链接总数
  •   文件属主的用户名
  •   文件属组的组名
  •   文件的大小(大小以字节为单位)
  •   文件的上次修改时间
  •   文件名或目录名

  通常我们会ls -a -l -F一起使用,当然这样写很复杂,可以直接这么写ls -alF

  过滤输出列表

  由前面的例子可知,默认情况下,ls命令会输出目录下的所有非隐藏文件。有时这个输出会显得过多,当你只需要查看单个少数文件信息时更是如此。
  幸而ls命令还支持在命令行中定义过滤器。它会用过滤器来决定应该在输出中显示哪些文件或目录。
  这个过滤器就是一个进行简单文本匹配的字符串。可以在要用的命令行参数之后添加这个过滤器:
1 :~/xiaoyu$ ls -l my_file 
2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file
3 :~/xiaoyu$
  当用户指定特定文件的名称作为过滤器时,ls命令只会显示该文件的信息。有时你可能不知道要找的那个文件的确切名称。ls命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:
  •   问号(?)代表一个字符:
  •   星号(*)代表零个或多个字符
:~/xiaoyu$ ls -l my_f?le
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file
:~/xiaoyu$

  其中,过滤器my_f?le与目录中的两个文件匹配,类似的,型号可匹配零个或多个字符。

:~/xiaoyu$ ls -l my_*
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:44 my_file2
:~/xiaoyu$

  使用星号找到了三个名字以my开头的文件,和问号一样,你可以把星号放在过滤器中的任意位置

:~/xiaoyu$ ls -l my_f*le
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file
:~/xiaoyu$
  在过滤器中使用星号和问号被称为文件扩展匹配(file globbing),指的是使用通配符进行模式匹配的过程。通配符正式的名称叫作元字符通配符(metacharacter wildcards)。除了星号和问号之外,还有更多的元字符通配符可用于文件扩展匹配。可以使用中括号。
:~/xiaoyu$ ls -l my_f[ai]le
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file
:~/xiaoyu$
  在这个例子中,我们使用了中括号以及在特定位置上可能出现的两种字符:a或i。中括号表示一个字符位置并给出多个可能的选择。可以像上面的例子那样将待选的字符列出来,也可以指定字符范围,例如字母范围[a – i]。
:~/xiaoyu$ ls -l my_f[a-z]le
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:43 my_fale
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file
:~/xiaoyu$
  另外,可以使用感叹号(!)将不需要的内容排除在外。
1 :~/xiaoyu$ ls -l my_f[!a]le
2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file

  注意:以上的(*)(?)([aj])([a-z])(!)不仅仅是在ls中有用,在linux需要用到过滤的地方,这几种方法都是十分常见有效的

处理文件

  创建文件

    我们总会时不时地遇到要创建空文件的情况。例如,有时应用程序希望在它们写入数据之前,某个日志文件已经存在,这时,可以用touch命令轻松创建空文件。

:~/xiaoyu$ touch test_one
:~/xiaoyu$ ls -l test_one 
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:03 test_one
:~/xiaoyu$ touch test_one
:~/xiaoyu$ ls -l test_one 
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:04 test_one
:~/xiaoyu$

  touch命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,因为touch命令只创建了一个空文件。

  touch命令还可用来改变文件的修改时间。这个操作并不需要改变文件的内容。

  如果只想改变访问时间,可以使用-a参数。

:~/xiaoyu$ touch -a test_one
:~/xiaoyu$ ls -l test_one
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:04 test_one
:~/xiaoyu$ ls -l --time=atime test_one
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:07 test_one
:~/xiaoyu$

  在上面的例子中,要注意的是,如果只使用ls –l命令,并不会显示访问时间。这是因为默认显示的是修改时间。要想查看文件的访问时间,需要加入另外一个参数:--time=atime。有了这个参数,就能够显示出已经更改过的文件访问时间。
  创建空文件和更改文件时间戳算不上你在Linux系统中的日常工作。不过复制文件可是在使用shell时经常要干的活儿。

   复制文件

    对系统管理员来说,在文件系统中将文件和目录从一个位置复制到另一个位置可谓家常便饭。cp命令可以完成这个任务。
    在最基本的用法里,cp命令需要两个参数——源对象和目标对象:
 
     cp source destination
 
    当source和destination参数都是文件名时,cp命令将源文件复制成一个新文件,并且以destination命名。新文件就像全新的文件一样,有新的修改时间。
:~/xiaoyu$ cp test_one test_two
:~/xiaoyu$ ls -l test*
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:04 test_one
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:10 test_two
:~/xiaoyu$
  新文件test_two和文件test_one的修改时间并不一样。如果目标文件已经存在,cp命令可能并不会提醒这一点。最好是加上-i选项,强制shell询问是否需要覆盖已有文件。
1 :~/xiaoyu$ cp -i test_one test_two
2 cp: overwrite ‘test_two‘? y
3 :~/xiaoyu$

  如果不回答y,文件复制将不会继续。也可以将文件复制到现有目录中。

:~/xiaoyu$ cp -i test_one /home/xiaoyu/Documents/
:~/xiaoyu$ ls -l /home/xiaoyu/Documents/
total 0
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:13 test_one
:~/xiaoyu$
  新文件现就在目录Documents中了,和源文件同名。
  之前的例子在目标目录名尾部加上了一个正斜线(/),这表明Documents是目录而非文件。这有助于明确目的,而且在复制单个文件时非常重要。如果没有使用正斜线,子目录/home/christine/Documents又不存在,就会有麻烦。在这种情况下,试图将一个文件复制到Documents子目录反而会创建一个名为Documents的文件,连错误消息都不会显示!

  上一个例子采用了绝对路径,不过也可以使用相对路径

1 :~/xiaoyu$ cp -i test_one ../Documents/
2 cp: overwrite ‘../Documents/test_one‘? y
3 :~/xiaoyu$

  之前讲过cd ..返回当前目录的父目录,单点符(.)就很适合cp命令。记住,单点符表示当前工作目录。如果需要将一个带有很长的源对象名的文件复制到当前工作目录中时,单点符能够简化该任务

:~/xiaoyu$ cp /etc/NetworkManager/NetworkManager.conf .
:~/xiaoyu$ ls -l NetworkManager.conf 
-rw-r--r-- 1 xiaoyu xiaoyu 76 Dec 17 15:33 NetworkManager.conf
:~/xiaoyu$

  制表键自动补全

  在使用命令行时,很容易输错命令,目录名或文件名。实际上,对长目录来说输错的概率还是蛮高的,按住Table键就可以为你自动补全命令或者目录名了,这里就不演示了

  链接文件

  链接文件是Linux文件系统的一个优势。如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种
  不同类型的文件链接:
  •   符号链接 
  •   硬链接

  符号链接就是实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。

  要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用ln命令以及-s选项来创建符号链接

:~/xiaoyu$ touch data_file
:~/xiaoyu$ ls -l data_file 
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:53 data_file
:~/xiaoyu$ ln -s data_file sl_data_file
:~/xiaoyu$ ls -l *data_file
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 15:53 data_file
lrwxrwxrwx 1 xiaoyu xiaoyu 9 Dec 17 15:53 sl_data_file -> data_file
:~/xiaoyu$

   另外还要注意的是,符号链接的文件大小与数据文件的文件大小。符号链接sl_data_file只有9个字节,而data_file有0个字节。这是因为sl_data_file仅仅只是指向data_file而已。它们的内容并不相同,是两个完全不同的文件。

  另一种证明链接文件是独立文件的方法是查看inode编号。文件或目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。要查看文件或目录的inode编号,可以给ls命令加入-i参数。
1 :~/xiaoyu$ ls -i *data_file
2 2752954 data_file  2752955 sl_data_file
3 :~/xiaoyu$
  从这个例子中可以看出数据文件的inode编号是2752954,而sl_data_file的inode编号则是2752955。所以说它们是不同的文件。

  硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须实现存在,只不过这次使用ln命令时不再需要加入额外的参数了。

:~/xiaoyu$ touch code_file
:~/xiaoyu$ ls -l code_file
-rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 16:12 code_file
:~/xiaoyu$ ln code_file hl_code_file
:~/xiaoyu$ ls -li *code_file
2752979 -rw-rw-r-- 2 xiaoyu xiaoyu 0 Dec 17 16:12 code_file
2752979 -rw-rw-r-- 2 xiaoyu xiaoyu 0 Dec 17 16:12 hl_code_file
:~/xiaoyu$
  在上面的例子中,我们使用ls -li命令显示了*code_files的inode编号以及长列表。注意,带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件。还要注意的是,链接计数(列表中第三项)显示这两个文件都有两个链接。另外,它们的文件大小也一模一样。

  注意:只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。

  复制链接文件的时候一定要小心。如果使用cp命令复制一个文件,而该文件又已经被链接到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。用不着复制链接文件,可以创建原始文件的另一个链接。同一个文件拥有多个链接,这完全没有问题。但是,千万别创建软链接文件的软链接。这会形成混乱的链接链,不仅容易断裂,还会造成各种麻烦。
  你可能觉得符号链接和硬链接的概念不好理解。幸好下一节中的文件重命名容易明白得多。

  重命名文件

  在Linux中,重命名文件成为移动(moving)。mv命令可以将文件和目录移动到另一个位置或重新命名
 
:~/xiaoyu$ touch fall fell fill full
:~/xiaoyu$ ls -li f*ll
2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fall
2752955 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fell
2752979 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fill
2755050 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 full


:~/xiaoyu$ mv fall fzll
:~/xiaoyu$ ls -li f*ll
2752955 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fell
2752979 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fill
2755050 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 full
2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fzll
:~/xiaoyu$
  注意:移动文件会将文件名从fall更改为fzll,但inode编号和时间戳保持不变。这是因为mv只影响文件名,也可以使用mv来移动文件的位置
:~/xiaoyu$ ls -li /home/xiaoyu/xiaoyu/fzll 
2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 /home/xiaoyu/xiaoyu/fzll
:~/xiaoyu$ ls -li /home/xiaoyu/Pictures/
total 0
:~/xiaoyu$ mv fzll ../Pictures/
:~/xiaoyu$ ls -li ../Pictures/
total 0
2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 fzll
:~/xiaoyu$ ls -li fzll
ls: cannot access ‘fzll‘: No such file or directory
:~/xiaoyu$
  在这个例子中,我们使用mv命令把文件fzll从/home/xiaoyu/xiaoyu/ 移动到了 /home/xiaoyu/Pictures/。和上例子一样,这个操作没有改变这个文件的inode号跟时间戳
  和cp命令一样,也可以在mv命令后面加上-i参数,这样在试图覆盖已有的文件时,我们就会得到提示
  唯一发生变化就是,/home/xiaoyu/xiaoyu/目录下不再有文件fzll,因为它已经离开了原先的位置,这就是mv命令所做的事情。也可以使用mv命令移动文件位置并修改文件名称,这些操作只需要一步就能完成。
:~/xiaoyu$ mv ../Pictures/fzll ./fall
:~/xiaoyu$ ls -li ../Pictures/fzll
ls: cannot access ‘../Pictures/fzll‘: No such file or directory
:~/xiaoyu$ ls -li ./fall
2752954 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:37 ./fall
:~/xiaoyu$
  这个例子中,我们将文件fzll从子目录Pictures中移动到了目录/home/xiaoyu/xiaoyu/ 下,并将名字更改成了fall。文件的时间戳和inode编号都没有改变。改变的只有位置和名称。
  也可以使用mv命令移动整个目录以及内容
:~/my_directory$ touch 1.sh 2.sh 3.sh 4.sh
:~/my_directory$ cd ..
:~$ ls -li my_directory/
total 0
2755057 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 1.sh
2755059 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 2.sh
2755060 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 3.sh
2755061 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 4.sh
:~$ mv my_directory/ new_my_directory
:~$ ls -li new_my_directory/
total 0
2755057 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 1.sh
2755059 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 2.sh
2755060 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 3.sh
2755061 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 13:53 4.sh
:~$ ls -li my_directory
ls: cannot access ‘my_directory‘: No such file or directory
:~$
 
  目录内容没有发生变化,只有目录名发生了变化。
  mv命令是用来移动文件!!!mv命令可能有危险的就是会删除文件,如果你很警惕,切记加入-i参数

  删除文件

  迟早会有要删除文件的时候,不管时清理文件系统还是删除某个软件包,总要有删除文件的时候。
  在Linux中,删除(deleting)叫做移除(removing)。bash shell中删除文件的命令时rm。rm命令的基本格式十分简单。
:~/xiaoyu$ rm -i fall
rm: remove regular empty file ‘fall‘? y
:~/xiaoyu$ ls -li fall
ls: cannot access ‘fall‘: No such file or directory
:~/xiaoyu$ 
  注意:-i参数提示你是不是要真的删除该文件。bash shell中灭有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用rm命令时,要养成总是加入-i参数的好习惯。
  也可以使用通配符删除成组的文件。别忘了使用-i选项保护好自己的文件。


:~/xiaoyu$ rm -i f*ll
rm: remove regular empty file ‘fell‘? y
rm: remove regular empty file ‘fill‘? y
rm: remove regular empty file ‘full‘? y
:~/xiaoyu$ ls -al f*ll
ls: cannot access ‘f*ll‘: No such file or directory
:~/xiaoyu$ 
  rm命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用-f参数强制删除,小心为妙!

  处理目录

  在Linux中,有些命令(比如cp命令)对文件和目录都有效,而有些只对目录有效。创建新目录需要使用本节讲到的一个特殊命令。删除目录也很有意思,本节也会讲到。

  创建目录
  在Linux中创建目录很简单,使用mkdir命令即可:

:~/xiaoyu$ mkdir one_dir
:~/xiaoyu$ ls -ld one_dir/
drwxrwxr-x 2 xiaoyu xiaoyu 4096 Dec 18 14:09 one_dir/
:~/xiaoyu$
  系统创建了一个名为one_dir的新目录。注意,新目录长列表是以d开头的。这表示one_dir并不是文件,而是一个目录 。
  可以根据需要批量地创建目录和子目录。但是,如果你想蛋蛋靠mkdir命令来实现,就会得到下面的错误消息:
1 :~/xiaoyu$ mkdir two_dir/sub_dir/under_dir
2 mkdir: cannot create directory ‘two_dir/sub_dir/under_dir’: No such file or directory
3 :~/xiaoyu$ 
  要想同时创建多个目录和子目录,需要加入-p参数:


:~/xiaoyu$ mkdir -p two_dir/sub_dir/under_dir
:~/xiaoyu$ ls -R two_dir/
two_dir/:
sub_dir

two_dir/sub_dir:
under_dir

two_dir/sub_dir/under_dir:
:~/xiaoyu$ 


mkdir参数
参数代表的意义


-m, --mode=MODE
设置文件模式(在chmod中),而不是a=rwx - umask



-p, --parents
没有错误,如果存在,使父目录需要



-v, --verbose



为每个创建的目录打印一条消息

  删除目录
  删除目录有时会显得很棘手,shell会尽可能的防止我们捅娄子。删除目录的基本命令是rmdir。

:~/xiaoyu$ touch one_dir/my_file
:~/xiaoyu$ ls -li one_dir/
total 0
2755062 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 18 14:26 my_file
:~/xiaoyu$ rmdir one_dir/
rmdir: failed to remove ‘one_dir/‘: Directory not empty
:~/xiaoyu$
  默认情况下,rmdir命令只删除空目录。因为我们在one_dir目录下创建了一个文件my_file,所以rmdir拒绝删除目录。要解决这一问题,得先把目录中的文件删掉,然后才能在空目录上使用rmdir命令。
:~/xiaoyu$ rm -i one_dir/my_file 
rm: remove regular empty file ‘one_dir/my_file‘? y
:~/xiaoyu$ rmdir one_dir/
:~/xiaoyu$ ls -ld one_dir
ls: cannot access ‘one_dir‘: No such file or directory
  rmdir没有-i选项来询问是否要删除目录。这也是为什么说rmdir只能删除空目录还是有好处的原因。
  也可以在整个非空目录上使用rm命令。使用-r参数使得命令可以向下进入目录(递归),删除其中的文件,然后再删除目录本身。
:~/xiaoyu$ rm -ri two_dir/
rm: descend into directory ‘two_dir/‘? y
rm: descend into directory ‘two_dir/sub_dir‘? y
rm: remove directory ‘two_dir/sub_dir/under_dir‘? y
rm: remove directory ‘two_dir/sub_dir‘? y
rm: remove directory ‘two_dir/‘? y
:~/xiaoyu$ ls -l two_dir
ls: cannot access ‘two_dir‘: No such file or directory
:~/xiaoyu$

  查看文件内容

    查看文件类型

    Linux中有几个命令可以查看文件的内容,而不需要调用其它文本编辑器。
    在显示文件内容之前,应该先了解一下文件的类型,这里不描述,自行百度去
    file命令能够探测文件的内部,并决定文件是什么类型的:
:~/xiaoyu$ ls -al .
total 16
drwxrwxr-x  3 xiaoyu xiaoyu 4096 Dec 18 14:41 .
drwxr-xr-x 20 xiaoyu xiaoyu 4096 Dec 18 13:54 ..
drwxrwxr-x  2 xiaoyu xiaoyu 4096 Dec 18 14:41 my_dir
-rw-rw-r--  1 xiaoyu xiaoyu    0 Dec 18 14:39 one_file
-rw-rw-r--  1 xiaoyu xiaoyu   11 Dec 18 14:41 shell.sh
:~/xiaoyu$ file my_dir/
my_dir/: directory
:~/xiaoyu$ file one_file 
one_file: empty
:~/xiaoyu$ file shell.sh 
shell.sh: ASCII text
:~/xiaoyu$

  查看整个文件

  如果手头有一个很大的文本文件,你可能会想看看里面是什么内容。在Linux上有3个不同的命令可以完成这个任务。
  1. cat命令
  cat命令是显示文本文件中所有数据的得力工具。

$ cat test1 
hello 
This is a test file. 
That we‘ll use to test the cat command. 
$

  没什么特别的,就是文本文件的内容而已。这里还有一些可以和cat命令一起用的参数,可能对你有所帮助。
  -n参数会给所有的行加上行号。

$ cat -n test1
1 hello
2
3 This is a test file.
4
5
6 That we‘ll use to test the cat command.
$

  这个功能在检查脚本时很有用。如果只想给有文本的行加上行号,可以用-b参数。

$ cat -b test1 
1 hello 
2 This is a test file. 
3 That we‘ll use to test the cat command. 
$

  最后,如果不想让制表符出现,可以用-T参数。

$ cat -T test1 
hello 
This is a test file. 
That we‘ll use to^Itest the cat command. 
$

  -T参数会用^I字符组合去替换文中的所有制表符。

  对大型文件来说,cat命令有点繁琐。文件的文本会在显示器上一晃而过。好在有一个简单办法可以解决这个问题。
  
  2. more命令
  cat命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人员编写了more命令。more命令会显示文本文件的内容,但会在显示每页数据之后停下来。我们输入命令more /etc/bash.bashrc生成如下图所显示的内容。
       Linux shell(一)


  3. less命令

  从名字上看,它并不像more命令那样高级。但是,less命令的命名实际上是个文字游戏(从俗语“less is more”得来),它实为more命令的升级版。它提供了一些极为实用的特性,能够实现在文本文件中前后翻动,而且还有一些高级搜索功能。less命令的操作和more命令基本一样,一次显示一屏的文件文本。除了支持和more命令相同的命令集,它还包括更多的选项。

  注意: 要想查看less命令所有的可用选项,可以输入man less浏览对应的手册页。也可以这样查看more命令选项的参考资料。

  其中一组特性就是less命令能够识别上下键以及上下翻页键(假设你的终端配置正确)。在查看文件内容时,这给了你全面的控制权。

  查看部分文件

通常你要查看的数据要么在文本文件的开头,要么在文本文件的末尾。如果这些数据是在大型文件的起始部分,那你就得等cat或more加载完整个文件之后才能看到。如果数据是在文件的末尾(比如日志文件),那可能需要翻过成千上万行的文本才能到最后的内容。好在Linux有解决这两个问题的专用命令。
  1. tail命令
  tail命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。
  出于演示的目的,我们创建了一个包含20行文本的文本文件。使用cat命令显示该文件的全部内容如下:

$ cat log_file 
line1 
line2 
line3 
line4 
line5 
Hello World - line 6 
line7 
line8 
line9 
line10 
line11 
Hello again - line 12 
line13 
line14 
line15 
Sweet - line16 
line17 
line18 
line19 
Last line - line20 
$
  现在你已经看到了整个文件,可以再看看使用tail命令浏览文件最后10行的效果:
$ tail log_file 
line11 
Hello again - line 12 
line13
line14 
line15 
Sweet - line16 
line17 
line18 
line19 
Last line - line20 
$
  可以向tail命令中加入-n参数来修改所显示的行数。在下面的例子中,通过加入-n 2使tail命令只显示文件的最后两行:
  -f参数是tail命令的一个突出特性。它允许你在其他进程使用该文件时查看文件的内容。tail命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
 
  2. head命令
   head命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前10行的文本:
$ head log_file 
line1 
line2 
line3 
line4 
line5 
Hello World - line 6 
line7 
line8 
line9 
line10 
$
   类似于tail命令,它也支持-n参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数:



$ head -5 log_file 
line1 
line2 
line3 
line4 
line5 
$
  文件的开头通常不会改变,因此head命令并像tail命令那样支持-f参数特性。head命令是一种查看文件起始部分内容的便捷方法。

相关推荐