Linux shell(一)
Linux shell(一)
浏览Linux文件系统
Linux中最基础也是最必要的一条指令
cd destination
cd命令可接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指定目标路径,它将切换到用户主目录。
destination参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。
1. 绝对文件路径
1 :~$ cd /usr/bin 2 :/usr/bin$
pwd命令
pwd命令可以显示出shell会话的当前目录,这个目录被称作当前工作目录。pwd命令的用法如下:
1 :/usr/bin$ pwd 2 /usr/bin 3 :/usr/bin$
可以使用绝对路径文件路径切换到Linux虚拟目录结构中的任何一级:
:/$ cd sys/power :/sys/power$ pwd /sys/power :/sys/power$
但是如果只是在自己的主目录中工作,经常使用绝对路径的话未免太过冗长,例如,若已经位于目录/home/xiaoyu,在输入下方这样的命令切换到Documents目录就有点繁琐了
/home/Documents
2. 相对文件路径
:~$ pwd /home/xiaoyu :~$ cd Documents/ :~/Documents$ pwd /home/xiaoyu/Documents :~/Documents$
事实上,在实际工程中,使用绝对路径跟相对路径都没啥讲究,都会互相结合使用。
返回上一级目录
返回上一级目录,我们使用双点符(..),表示当前目录的父目录
双点符在目录层级中移动时非常便利。如果正处在主目录下的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 :~$
由于结果太长,我这里就不贴了,建议在目录层级比较少的目录下操作
显示长列表
在基本的输出列表中,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
过滤输出列表
1 :~/xiaoyu$ ls -l my_file 2 -rw-rw-r-- 1 xiaoyu xiaoyu 0 Dec 17 14:41 my_file 3 :~/xiaoyu$
- 问号(?)代表一个字符:
- 星号(*)代表零个或多个字符
:~/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$
:~/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$
:~/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命令只创建了一个空文件。
如果只想改变访问时间,可以使用-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$
复制文件
:~/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$
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$
上一个例子采用了绝对路径,不过也可以使用相对路径
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键就可以为你自动补全命令或者目录名了,这里就不演示了
链接文件
- 符号链接
- 硬链接
符号链接就是实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。
要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用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而已。它们的内容并不相同,是两个完全不同的文件。
1 :~/xiaoyu$ ls -i *data_file 2 2752954 data_file 2752955 sl_data_file 3 :~/xiaoyu$
硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须实现存在,只不过这次使用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$
注意:只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
重命名文件
:~/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$
:~/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$
:~/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$
:~/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 :~$
删除文件
:~/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$
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$
:~/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
:~/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$
查看文件内容
查看文件类型
:~/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字符组合去替换文中的所有制表符。
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 log_file line11 Hello again - line 12 line13 line14 line15 Sweet - line16 line17 line18 line19 Last line - line20 $
$ 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 $