Linux shell--基础指令

浏览Linux文件系统

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

  cd destination

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

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

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

1. 绝对文件路径

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

  pwd命令

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

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

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

 xiaoyu@ubuntu:/$ cd sys/power
xiaoyu@ubuntu:/sys/power$ pwd
/sys/power
xiaoyu@ubuntu:/sys/power$

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

/home/Documents

2. 相对文件路径

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

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

  返回上一级目录

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

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

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

文件和目录列表

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

  基本的列表功能

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

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

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

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

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

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

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

 xiaoyu@ubuntu:~$ pwd
/home/xiaoyu
xiaoyu@ubuntu:~$ 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
xiaoyu@ubuntu:~$
  所有以点号开头的隐藏文件现在都显示出来了。注意,有三个以.bash开始的文件。它们是bash shell环境所使用的隐藏文件
   -R参数是ls命令可用的另一个参数,叫作递归选项。它列出了当前目录下包含的子目录中的文件。如果目录很多,这个输出就会很长。以下是-R参数输出的简单例子:

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

  显示长列表

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

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

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

  过滤输出列表

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

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

 xiaoyu@ubuntu:~/xiaoyu$ ls -l my_*
-rw-rw-r-- xiaoyu xiaoyu Dec : my_fale
-rw-rw-r-- xiaoyu xiaoyu Dec : my_file
-rw-rw-r-- xiaoyu xiaoyu Dec : my_file2
xiaoyu@ubuntu:~/xiaoyu$

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

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

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

处理文件

  创建文件

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

 xiaoyu@ubuntu:~/xiaoyu$ touch test_one
xiaoyu@ubuntu:~/xiaoyu$ ls -l test_one
-rw-rw-r-- xiaoyu xiaoyu Dec : test_one
xiaoyu@ubuntu:~/xiaoyu$ touch test_one
xiaoyu@ubuntu:~/xiaoyu$ ls -l test_one
-rw-rw-r-- xiaoyu xiaoyu Dec : test_one
xiaoyu@ubuntu:~/xiaoyu$

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

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

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

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

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

  复制文件

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

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

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

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

 xiaoyu@ubuntu:~/xiaoyu$ cp -i test_one ../Documents/
cp: overwrite '../Documents/test_one'? y
xiaoyu@ubuntu:~/xiaoyu$

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

 xiaoyu@ubuntu:~/xiaoyu$ cp /etc/NetworkManager/NetworkManager.conf .
xiaoyu@ubuntu:~/xiaoyu$ ls -l NetworkManager.conf
-rw-r--r-- xiaoyu xiaoyu Dec : NetworkManager.conf
xiaoyu@ubuntu:~/xiaoyu$

  制表键自动补全

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

  链接文件

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

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

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

 xiaoyu@ubuntu:~/xiaoyu$ touch data_file
xiaoyu@ubuntu:~/xiaoyu$ ls -l data_file
-rw-rw-r-- xiaoyu xiaoyu Dec : data_file
xiaoyu@ubuntu:~/xiaoyu$ ln -s data_file sl_data_file
xiaoyu@ubuntu:~/xiaoyu$ ls -l *data_file
-rw-rw-r-- xiaoyu xiaoyu Dec : data_file
lrwxrwxrwx xiaoyu xiaoyu Dec : sl_data_file -> data_file
xiaoyu@ubuntu:~/xiaoyu$

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

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

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

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

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

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

  重命名文件

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

  删除文件

  迟早会有要删除文件的时候,不管时清理文件系统还是删除某个软件包,总要有删除文件的时候。
  在Linux中,删除(deleting)叫做移除(removing)。bash shell中删除文件的命令时rm。rm命令的基本格式十分简单。
 xiaoyu@ubuntu:~/xiaoyu$ rm -i fall
rm: remove regular empty file 'fall'? y
xiaoyu@ubuntu:~/xiaoyu$ ls -li fall
ls: cannot access 'fall': No such file or directory
xiaoyu@ubuntu:~/xiaoyu$

  注意:-i参数提示你是不是要真的删除该文件。bash shell中灭有回收站或垃圾箱,文件一旦删除,就无法再找回。因此,在使用rm命令时,要养成总是加入-i参数的好习惯。

  也可以使用通配符删除成组的文件。别忘了使用-i选项保护好自己的文件。

 xiaoyu@ubuntu:~/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@ubuntu:~/xiaoyu$ ls -al f*ll
ls: cannot access 'f*ll': No such file or directory
xiaoyu@ubuntu:~/xiaoyu$

  rm命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用-f参数强制删除,小心为妙!

  处理目录

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

  创建目录

  在Linux中创建目录很简单,使用mkdir命令即可:
 xiaoyu@ubuntu:~/xiaoyu$ mkdir one_dir
xiaoyu@ubuntu:~/xiaoyu$ ls -ld one_dir/
drwxrwxr-x xiaoyu xiaoyu Dec : one_dir/
xiaoyu@ubuntu:~/xiaoyu$
  系统创建了一个名为one_dir的新目录。注意,新目录长列表是以d开头的。这表示one_dir并不是文件,而是一个目录 。
  可以根据需要批量地创建目录和子目录。但是,如果你想蛋蛋靠mkdir命令来实现,就会得到下面的错误消息:
 xiaoyu@ubuntu:~/xiaoyu$ mkdir two_dir/sub_dir/under_dir
mkdir: cannot create directory ‘two_dir/sub_dir/under_dir’: No such file or directory
xiaoyu@ubuntu:~/xiaoyu$

  要想同时创建多个目录和子目录,需要加入-p参数:

 xiaoyu@ubuntu:~/xiaoyu$ mkdir -p two_dir/sub_dir/under_dir
xiaoyu@ubuntu:~/xiaoyu$ ls -R two_dir/
two_dir/:
sub_dir two_dir/sub_dir:
under_dir two_dir/sub_dir/under_dir:
xiaoyu@ubuntu:~/xiaoyu$
mkdir参数 参数代表的意义
-m, --mode=MODE 设置文件模式(在chmod中),而不是a=rwx - umask
-p, --parents 没有错误,如果存在,使父目录需要
-v, --verbose
  • 为每个创建的目录打印一条消息

  删除目录

  删除目录有时会显得很棘手,shell会尽可能的防止我们捅娄子。删除目录的基本命令是rmdir。
 xiaoyu@ubuntu:~/xiaoyu$ touch one_dir/my_file
xiaoyu@ubuntu:~/xiaoyu$ ls -li one_dir/
total
-rw-rw-r-- xiaoyu xiaoyu Dec : my_file
xiaoyu@ubuntu:~/xiaoyu$ rmdir one_dir/
rmdir: failed to remove 'one_dir/': Directory not empty
xiaoyu@ubuntu:~/xiaoyu$
  默认情况下,rmdir命令只删除空目录。因为我们在one_dir目录下创建了一个文件my_file,所以rmdir拒绝删除目录。要解决这一问题,得先把目录中的文件删掉,然后才能在空目录上使用rmdir命令。
 xiaoyu@ubuntu:~/xiaoyu$ rm -i one_dir/my_file
rm: remove regular empty file 'one_dir/my_file'? y
xiaoyu@ubuntu:~/xiaoyu$ rmdir one_dir/
xiaoyu@ubuntu:~/xiaoyu$ ls -ld one_dir
ls: cannot access 'one_dir': No such file or directory
  rmdir没有-i选项来询问是否要删除目录。这也是为什么说rmdir只能删除空目录还是有好处的原因。
  也可以在整个非空目录上使用rm命令。使用-r参数使得命令可以向下进入目录(递归),删除其中的文件,然后再删除目录本身。
 xiaoyu@ubuntu:~/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@ubuntu:~/xiaoyu$ ls -l two_dir
ls: cannot access 'two_dir': No such file or directory
xiaoyu@ubuntu:~/xiaoyu$

  查看文件内容

    查看文件类型

    Linux中有几个命令可以查看文件的内容,而不需要调用其它文本编辑器。
    在显示文件内容之前,应该先了解一下文件的类型,这里不描述,自行百度去
    file命令能够探测文件的内部,并决定文件是什么类型的:
 xiaoyu@ubuntu:~/xiaoyu$ ls -al .
total
drwxrwxr-x xiaoyu xiaoyu Dec : .
drwxr-xr-x xiaoyu xiaoyu Dec : ..
drwxrwxr-x xiaoyu xiaoyu Dec : my_dir
-rw-rw-r-- xiaoyu xiaoyu Dec : one_file
-rw-rw-r-- xiaoyu xiaoyu Dec : shell.sh
xiaoyu@ubuntu:~/xiaoyu$ file my_dir/
my_dir/: directory
xiaoyu@ubuntu:~/xiaoyu$ file one_file
one_file: empty
xiaoyu@ubuntu:~/xiaoyu$ file shell.sh
shell.sh: ASCII text
xiaoyu@ubuntu:~/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
hello
This is a test file.
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生成如下图所显示的内容。
       

  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
line7
line8
line9
line10
line11
Hello again - line
line13
line14
line15
Sweet - line16
line17
line18
line19
Last line - line20
$
  现在你已经看到了整个文件,可以再看看使用tail命令浏览文件最后10行的效果:
 $ tail log_file
line11
Hello again - line
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
line7
line8
line9
line10
$

  类似于tail命令,它也支持-n参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数:

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

Linux shell--基础指令的更多相关文章

  1. linux shell 基础 使用日志与心得

    linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...

  2. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  3. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  4. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  5. Linux shell基础

    shell是核心程序kernel之外的指令解析器,是一个程序,同事是一种命令语言和程序设计语言 --shell是命令解析器,用户输入命令,它去解析. shell类型 ash,bash,ksh,csh, ...

  6. linux shell基础语法

    1.第一个Shell脚本 打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码 ...

  7. Linux常用基础指令

    Linux常用指令 一.基础命令 whoami查看当前用户 pwd查看当前所在位置 ls 查看当前文件夹的内容 ls -l或ll显示详细内容 cd 绝对路径:从根目录开始的路径 cd / 文件夹 返回 ...

  8. Linux Shell基础 环境变量配置文件

    source命令:使环境变量配置文件强制生效 source 命令会强制执行脚本中的全部命令,而忽略脚本文件的权限.该命令主要用于让重新配置的环境变量配置文件强制生效.source 命令格式如下: [r ...

  9. Linux Shell基础 位置参数变量、预定义变量

    位置参数变量 在 Linux 的命令行中,当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数.其中,$0 代表命令行本身,$1 代表第 1 个参数,$2 代表第 2 个参数 ...

  10. Linux Shell基础 环境变量

    环境变量 环境变量和用户自定义变量最主要的区别在于,环境变量是全局变量,而用户自定义变量是局部变量.用户自定义变量只在当前的 Shell 中生效,而环境变量会在当前 Shell 和这个 Shell 的 ...

随机推荐

  1. HTTP (了解URL)

    HTTP-URL URL是统一资源定位符,是互联网上标准的资源地址表示方法 URL组成: 协议头 用户名:密码(FTP) 主机名(域名). 三级域名.二级域名.顶级域名 / [IP] 端口号 目录/文 ...

  2. Gradle 自定义插件

    使用版本 5.6.2 插件被用来封装构建逻辑和一些通用配置.将可重复使用的构建逻辑和默认约定封装到插件里,以便于其他项目使用. 你可以使用你喜欢的语言开发插件,但是最终是要编译成字节码在 JVM 运行 ...

  3. Dynamics 365中的Client API form context (formContext)

    适用于Dynamics 365 for Customer Engagement apps 9.x版本. 本文是一篇翻译,原文来源是微软官方文档. 本文链接:https://www.cnblogs.co ...

  4. 使用 SQL 服务器时,"评估期已过期"错误消息

    当打开sql server2008企业管理器的时候,出现报错“评估期已过.有关如何升级的测试版软件的信息.....” 修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microso ...

  5. Vue 04

    目录 创建Vue项目 Vue项目环境搭建 Vue项目创建 pycharm配置并启动vue项目 vue项目目录结构分析 项目生命周期 添加组件-路由映射关系 文件式组件结构 配置全局css样式 子组件的 ...

  6. promise和axios

    1.接口调用方式 原生ajax 基于jQuery的ajax fetch axios 异步 JavaScript的执行环境是「单线程」 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的 ...

  7. Docker异常:/lib/x86_64-linux-gnu/libnss_files.so.2: symbol __libc_readline_unlocked, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference

    当使用docker cp 将容器内数据拷贝至主机时,或是使用docker export 命令归档容器文件时,出现下述异常: Error response from daemon: error proc ...

  8. python面向对象-1

    1.面向对象的思想优点 优点: 简化代码 ,构建公共模板 ,扩展性强 思想: 类作为模板 ,对象通过模板实例化对象 ,对象去做事 ,抽象将显示存在的事物使用代码体现 2.三大特性 封装(狭义) : 对 ...

  9. C lang: The caracter reverse

    Ax_Code #include<stdio.h> int main(void) { int i; char string[7] = {"mrsoft"}; char ...

  10. idea开发时springboot项目时的自动编译和热部署

    前提:最好将idea的启动器设置一下 操作:1.file > Build,Execution,Deployment > Compiler 勾选 Build project automati ...