摘要:这是对周立功编著的《嵌入式Linux开发教程》的第7期连载。本期刊载内容有关LinuxLinux常见命令中的导航命令、目录命令和文件命令。下一期将连载网络操作命令、安装卸载文件系统等内容。
3.2 Linux常见命令
本节对进行嵌入式Linux开发经常会用到的一些操作和相关命令,进一步加深对Linux的了解。命令是Linux最重要的人机交互界面之一,学习和掌握Linux命令是学习Linux不可逾越的阶段。在Shell下,一些命令加上一些参数,或者几个简单命令进行组合,可以完成在图形界面下需要经过复杂操作才能完成的功能。“简单就是美”在Linux的命令中得到了很好的体现。
Linux的命令通常会有很多选项和参数,但日常操作中用到的都不多,在这里也仅仅择取常用的进行介绍,更多或者完整的Linux命令请参考Linux命令手册或者其它资料。在接触具体的命令之前,先对Linux命令的特点做一个概括,也是使用Linux命令的一些注意事项:
- 大多数命令都有各种参数和选项;
- 大多数命令的参数可以组合使用(相斥参数除外);
- 用“命令 --help”或者“man 命令”可以获取相应命令的详细用法;
- 命令/工具不同版本所支持的参数可能会有所差异;
- 命令区分大小写,包括参数;
- Shell支持TAB键命令补齐,输入命令开头字母,按TAB键能补齐命令。
3.2.1 导航命令
打开Linux的虚拟终端后,一般都停在用户主目录下。当前目录下有什么?如何进入到其它目录?进入其它目录后,如何才能知道当前的确切位置?像这类操作通常称之为导航。Linux下,能帮助进行导航的命令有3个:ls、cd和pwd。
1.查看当前目录的内容
打开Linux虚拟终端后,查看当前目录下的内容,几乎是所有Linux使用者的习惯。查看当前目录下有什么文件和目录,然后再进行其它操作。查看当前目录下的内容的命令式ls,简单的输入ls就可以了,参考图 3.2
图3.2 ls命令结果
ls命令应该是学习Linux的第一个命令。ls命令支持选项,加上不同选项,可以按不同条件查看或者按不同方式排序结果。用法:
$ ls [选项]
下面给出一些常用选项和说明,如表 3.2所列。
说明:
(1)Linux区分大小写,在输入的时候需要特别注意;
(2)各参数可以任意组合,如ls -la;
(3)支持通配符*、?等。
使用范例,以详细列表查看当前目录下的全部内容,可使用ls -la命令,结果如图 3.3所示。
图3.3 ls -la命令结果
ls -la结果中,以点号(.)开始的是隐藏文件。
在Linux下,隐藏一个文件只需将文件改名为点号(.)开始的文件名即可,而Windows下,通常需要修改文件属性。
2.切换工作目录
得知所处目录下的内容后,可以根据需求进行操作。如果想进入到更深的目录中去,或者进入到系统其它目录中去,又该如何操作?这就要用到cd命令。cd命令是change directory的缩写,用于改变工作目录,与MS-DOS的cd命令类似。用法:
$cd 目标路径
Linux下路径的表示方法,详见表 3.3。
说明:
(1)Linux下目录、计算机名和域名之间都是用斜线(/)分开,而非反斜线();
(2)Linux下切换目录,可用相对路径,亦可用绝对路径。
假定当前在用户主目录(~)下,先进入目录“/etc/network”目录,然后切换到“/etc/network/if-down.d”目录,接下来在“/etc/network/if-post-down.d”和“/etc/network/if-down.d”目录间切换,操作过程的命令如下:
vmuser@Linux-host:~$ cd /etc/network/
vmuser@Linux-host:/etc/network$ cd if-down.d/
vmuser@Linux-host:/etc/network/if-down.d$ cd ../if-down.d/
vmuser@Linux-host:/etc/network/if-down.d$ cd -
实际操作结果如图 3.4所示。
图3.4 cd命令操作示例
3.查看当前路径
掌握了前面介绍的ls和cd两条命令后,几乎可以走遍整个Linux文件系统中所允许访问的目录。但是如果将Linux的命令提示设置为只提示当前目录名而不会显示完整的路径,在Shell下如果进入的目录较深,有时候可能不清楚当前所在路径而“迷路”。pwd命令是一个导航辅助命令,功能是打印当前所在路径,告知用户当前所处位置。用法很简单,在Shell终端中输入pwd即可:
vmuser@Linux-host:
drivers$ pwd
如图 3.5所示是一个简单范例。
图3.5 pwd命令结果
3.2.2 目录操作命令
Linux下目录和文件都被称为文件,一般情况下不区分文件和目录,只是在特殊情况下加以区分。
1.创建目录
创建目录在日常研发过程中是再常用不过的了。在图形界面下,单击右键选择新建文件夹可以完成目录创建的工作。在命令行下,用mkdir命令可以更简单快速的创建一个或者多个目录,甚至多级目录。
mkdir用于创建一个或者多个目录,加上选项也可以创建多级目录,这样的快捷性是图形界面无法做到的。mkdir支持的选项如表 3.4所列。用法:
$mkdir [选项] [参数] 目录
创建一个目录。假如要在当前目录创建new_dir这个目录,命令如下:
vmuser@Linux-host: ~$mkdir new_dir
实际操作和结果如图 3.6所示。
图3.6 创建一个目录
操作完成后,可以在文件浏览器看到新创建的new_dir目录,如图 3.7所示。
图3.7 新创建的目录
创建多个目录。假如要在当前目录下一次性创建dir1、dir2、dir3这3个目录,只需在mkdir命令后面依次写目录名即可,命令如下:
vmuser@Linux-host:
test$ mkdir dir1 dir2 dir3
实际操作和结果如图 3.8所示。
图3.8 创建多个目录
操作完成后,可以在文件浏览器看到新创建的目录,如图 3.9所示。
图3.9 创建多个目录的效果
创建多级目录。假如需要创建dir1目录,并在其中创建apps子目录,同时在apps目录下再创建hello子目录,只需加上-p参数,操作命令如下:
vmuser@Linux-host: test$
mkdir –p dir1/apps/hello
实际操作和结果如图 3.10所示。
图3.10 创建多级目录
2.删除目录
如果一个目录不再需要,可以将其删除。Linux下有两个命令可用于删除目录,rmdir和rm。
(1)用rmdir 删除空目录
rmdir命令只能删除空目录,也可删除多级空目录。用法:
$rmdir dir1 dir2
注意:rmdir命令只能删除空目录,无法删除非空目录。
使用范例,删除空目录:
vmuser@Linux-host: test$
rmdir dir1 dir2
rmdir也支持参数-p,表示删除某个目录后,如果父目录也成了空目录,则连父目录一并删除。范例:
vmuser@Linux-host: test$
rmdir -p dir4/dir5/dir6/
(2)用rm命令删除
用rmdir命令很安全,不会误删数据,但是实际上用的不是很多,更常用的是用rm命令。rm命令既可以删除文件,也可以删除目录而不管目录是否非空。用法:
$rm [选项] 文件/目录
rm命令支持选项,用户可以控制删除过程,常用选项如表 3.5所列。
注意:删除命令,无论是删除目录还是文件,一旦删除,都将不可恢复,并不像Windows下或者桌面下会移动到回收站暂存。特别是一般的嵌入式并不设定“回收站”,所以在删除的时候请特别小心。
为了确保不误删文件,可使用alias别名,将rm命令设置为“rm -i”,这样每次删除都会有确认过程。用法:alias rm=”rm -i”。
使用示例,强制删除某些文件和目录:
vmuser@Linux-host:
test$ rm -fr dir3 video1.mpeg
如果加上-i参数,则需要用户确认:
vmuser@Linux-host: test$ rm -i config.gz
rm:是否删除有写保护的 普通文件 “config.gz”?
这样,只有用户输入y后方可删除,输入n则保留文件。
#p#
嵌入式Linux开发教程:文件操作命令之创建与与查看 #e#
3.2.3文件操作命令
1.创建空文件
在一些时候,为了某种特殊要求,需要在系统中创建一个空文件。touch命令可以完成这个功能,创建的文件大小为0,命令如下:
vmuser@Linux-host: ~$
touch a
操作过程和结果如图 3.11所示。
图3.11 创建空文件
2.创建一个有内容的文件
Linux下创建文件,可以使用文本编辑器如vi等来操作。对于简单的内容,可以用普通命令来创建文件。用普通命令创建非空文件,需要用到Linux Shell重定向机制,首先来了解一下重定向。
Linux Shell终端启动的时候会打开3个标准文件:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。Shell从标准输入(通常是键盘)接收命令,命令执行结果信息打印到标准输出(通常是终端屏幕)上,如有错误信息,则打印到标准错误(通常是终端屏幕)上,如图 3.12所示。
图3.12 标准输入输出和标准错误
Shell允许用户对输入输出进行重定向。输出重定向允许将输出信息从标准输出重定向到其它文件上,也可以重定向到某个设备如打印机上。如图 3.13所示是将标准输出重定向到文件的示意图。
图3.13 将标准输出重定向到文件
重定向在Linux下用“>”和“>>”表示,“>”表示输出到一个新文件中,而“>>”则表示输出到现有文件的末尾。如果文件已经存在,则直接操作文件,否则将创建新文件。
echo命令将内容回显到标准输出,使用echo命令加上重定向可以创建一个带内容的非空文件,用法:
$echo 内容 或者 “内容” #输出到标准输出
$echo 内容 或者
“内容” > 文件
#重定向到文件,如果文件不存在则创建新文件
回显内容如果不加引号,则用单空格替代多个连续空格,如果加了引号,则原封不动回显,图 3.14所示操作过程显示了这些差异。
图3.14 输出重定向
可以看到,第一次输入的内容没有引号,连续空格被单空格替换了,而第二次加了引号,连续空格依然保留。
3.查看文件类型
在Windows下,文件都有标准扩展,基本上可以根据文件扩展名来识别和判断文件类型,如.exe是可执行文件,.c是C代码文件、.zip是压缩文件等。
Linux与Windows不同,Linux下的文件并没有标准扩展名,Linux也不是根据扩展名来识别文件,而是根据文件头来识别文件类型。
尽管在大多数Linux发行版中,默认情况下都能以不同颜 {MOD}显示目录以及不同类型的文件,但是根据颜 {MOD}只能简单粗略判断常用类型文件。要准确确定一个文件的类型,必须依赖于file命令。file命令能读取文件头并识别文件类型,包括目录。用法:
$ file 文件
说明:只能查看具有可读属性的文件。
file命令支持通配符,如可以一次性查看当前目录下的全部文件类型,如图 3.15所示。
图3.15 file识别文件类型
file命令还可以查看二进制可执行文件的详细信息,包括所运行的处理器体系结构。在PC机上用gcc编译得到的程序,用file命令查看:
vmuser@Linux-host: hello$
file hello
hello.x86: ELF 32-bit LSB executable,
Intel 80386, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.9,
not stripped
而经过arm-linux-gcc交叉编译之后再次查看:
vmuser@Linux-host: hello$ file hello
hello: ELF 32-bit LSB executable,
ARM, version 1, dynamically linked (uses shared
libs), for GNU/Linux 2.6.27, not stripped
如果运行某个程序出现cannot execute binary file这的错误,很有可能是文件编译的目标体系结构与当前所运行的体系结构不一致,可用file这样的命令进行确认。
4.查看文件内容
准确判断文件类型类型后,对于ASCII码文件,无需使用特殊软件仅仅用Linux的命令就可以查看,如文本文件、C代码文件、Shell脚本文件等。Linux下可以查看文件内容的命令命令有好几个,如more/less、head/tail、cat等。
(1)用more和less命令查看
more和less两个命令都可用来浏览文本文件,可以分页查看文件内容,空格翻页。文件浏览完毕,按键盘q退出。用法:
$more/less 文件
相比来说less命令更加灵活,支持键盘的Page Up和Page Down键,可任意向前先后翻页浏览,并且还支持文本搜索。使用less打开文件后,输入/abc可在文本中搜索字符串abc,匹配的字符串高亮显示。如图 3.16所示是用less命令打开文件后搜索hello字符串的截图。
图3.16 less命令的字符串搜索
(2)用head/tail命令查看
head和tail这两个命令可分别查看文件头部和文件尾部,一般用于查看ASCII文件。默认显示10行,可加上参数指定显示内容的多少,支持的参数如表 3.6所列。用法:
$head/tail [选项][参数] 文件
说明,数字的表示方法:b 512,kB 1000,K 1024,MB 1000*1000,M 1024*1024等。
指定显示多少行,如查看文件头20行:
vmuser@Linux-host: hello$ head -n 20 install.cf
指定显示多少字节,例如,指定查看300字节:
vmuser@Linux-host: hello$
head -c 300 install.cf
查看文件开头的512字节:
vmuser@Linux-host: hello$ head -c 1b install.cf
(3)用cat命令查看
cat命令可以将一个或者多个文件输出到标准输出上,可以用于文件查看。用法:
$ cat 文件
5.文件合并
经常会有这么一种需求,将某个文件的内容添加到另外一个文件的末尾,或者要求对某一个文件进行行编号,这的工作在Windows下或者Linux图形界面下完成,都得花不少心思,基本上都得依赖于所使用的编辑软件。
尽管这样的工作比较复杂,但是在Linux命令行下,可以轻松解决,用cat命令可以几乎不费力就完成在图形界面下操作起来很复杂的工作。
cat命令可以将一个或者多个文件输出到标准输出,如果将标准输出重定位到某个文件,则将多个文件合并一个文件。用法:
$ cat [选项] 文件1 文件2 … [>文件3]
如果不加选项,则原封不动的显示各个文件,加上一些参数的话,可以对原文件进行一些处理,常用选项如表 3.2所列。
使用示例1,查看hello.c文件并编号:
vmuser@Linux-host: hello$ cat -n hello.c
1 #include
2 #include
3 #include
4 #include
5
6 int main(int argc, char **argv)
7 {
......
使用示例2,查看hello.c文件并忽略空白行编号:
vmuser@Linux-host: hello$ cat -b hello.c
1 #include
2 #include
3 #include
4 #include
5 int main(int argc, char **argv)
6 {
......
.
如果使用重定向符(>)可以将屏幕输出保存到另一个文件中,或者追加符(>>)可以将屏幕输出添加到某个文件末尾。示例,将hello.c和Makefile文件增加行号后合并为test文件:
vmuser@Linux-host: hello$
cat -n hello.c Makefile > test
说明: (1)重定向符(>)可以将标准输出重定向到其它输出或者文件,文件不存在则会创建新文件; (2)追加符(>>)则将标准输出追加到文件末尾,如果文件不存在则创建新文件;
6.文件压缩
在日常开发过程中,不可避免的会用到压缩文件,如现在不少开源软件都是以压缩包方式提供,下载后必须解压才能使用;另一方面,也经常需要制作压缩文件,例如将工作资料打包进行备份。无论是压缩还是解压,都可以使用tar工具来实现。
tar是UNIX系统的一个文件打包工具,只是连续首尾相连的将文件堆放起来,并不具备压缩功能,但是加上选项,tar可以调用其它压缩/解压工具,能够实现文件的压缩和解压。用法:
$tar [选项] 文件
tar工具常用选项如表 3.8所列。
使用示例:
(1)解压a.tar.bz2文件,并显示详细信息:
vmuser@Linux-host:
~$ tar -xjvf a.tar.bz2
(2)解压b.tar.gz文件,并指定解压到/home/chenxibing/目录:
vmuser@Linux-host:
~$ tar -xzvf b.tar.gz -C /home/chenxibing
紧跟tar命令选项的“-”可以不需要,但是-C的“-”是必须的,例如上一条命令等价于:
vmuser@Linux-host:
~$ tar xzvf b.tar.gz -C /home/chenxibing
(3)将drivers目录的文件打包,创建一个.tar.bz2压缩文件:
vmuser@Linux-host:
~$ tar -cjvf drivers.tar.bz2 drivers
7.删除文件
删除文件用rm命令,用法与删除目录相同。
8.文件改名和移动
在日常操作中,经常会将文件从一个目录移动到另外一个目录,或者对文件进行改名。在Linux下,文件移动和改名都是通过mv命令实现的,且移动和改名可以同时实现。用法:
$mv 源文件/目录 目的文件/目录
若目的路径与源路径不相同,则进行移动操作,如相同则进行改名操作。
文件改名和移动的用法比较简单,图 3.17所示示例中,先将目录other改名为newdir,然后再将newdir移动到上一级目录并改名为hello2。
图3.17 改名和移动
说明:讲删除命令的时候,提到删除的文件不会在回收站暂存,在通用桌面Linux,一般都设有回收站,在桌面下删除一般会暂存在回收站,在命令行下若要想将某个文件暂存回收站,只能用mv命令,将文件移动到回收站中。Linux下的回收站,一般在主目录下,为隐藏文件.Trash,不同发行版回收站的路径也各不相同。Ubuntu的回收站目录是“~/.local/share/Trash”。
Ubuntu图形界面下的删除,实际上都是mv指令,将“删除”的文件移动到回收站,清空垃圾桶才是用rm命令彻底删除。
严格来说,Linux下的文件名是由“路径+文件名”组成的,不同目录的两个同名文件实际上不是一个文件,如/home/lpc3250/apps/hello.c与/home/lpc3250/drivers/hello.c是两个不同文件。所以,Linux下文件的改名和移动实际上是一回事。
9.文件复制
在图形界面下复制文件,无非是选中某个文件,然后选择复制操作,再进入将要复制到的目的目录,再粘贴。在命令行下无需这么复杂,只需输入简单的命令,就可以完成各种不同需求的文件复制操作。cp命令用法:
$cp [选项] 源文件/目录
目的文件/目录
cp命令支持多种选项,可实现多种不同操作,常用的选项见表 3.9。
通过cp命令,可以在同一目录下将文件/目录复制为另外一个文件/目录,也可将文件/目录复制到其它目录,还可用其它文件名,图 3.18所示的范例演示了这些操作。
图 3.18 文件复制
10.创建链接
链接文件在Linux系统中很常见,特别是库文件目录以及/etc下与启动级别相关的目录。例如“/etc/rc5.d/S99rc.local”文件,实际上是链接到“/etc/init.d/rc.local”文件的一个软链接,如图 3.19所示。
图 3.19 软链接文件
Linux创建链接的命令为ln,用法:
$ ln 选项
源文件/目录 目标文件
Linux下的链接分软链接和硬链接两种,默认创建硬链接,选项加上-s则创建软链接。
硬链接通过索引节点进行链接,相当于源文件的镜像,占用源文件一样大小的空间,修改其中任何一个,另外一个都会进行同样的改动。给一个文件创建硬链接后,文件属性的硬连接数会增加。
如图 3.20所示的示例,hello.c原有硬链接数是1,创建硬链接main.c后,main.c和hello.c文件大小一样,两者的硬连接数都增加为2。
图 3.20 创建硬链接
硬链接不能跨文件系统,只能在同一个文件系统内进行链接,且不能对目录文件建立硬链接。给目录创建硬链接会出错,如图 3.21所示。
图 3.21 创建目录硬链接错误
软链接和硬链接不同,软链接是产生一个新文件,这个文件指向另一个文件的位置,类似于Windows下的快捷方式。通常用的更多的是软链接,软链接可以跨文件系统,且可用于任何文件,包括目录文件。
假定为了使用方便,需要给dir1目录创建一个软链接lpc,创建和结果如图 3.22所示。
图 3.22 创建软链接
11.改变文件和目录权限
Linux系统是一个真正的多用户操作系统,系统的每个目录和文件对不同用户开放都有不同的权限。一个普通文件/bin/bash的ls -l输出信息:
vmuser@Linux-host:
~$ ls -l /bin/bash
-rwxr-xr-x 1 root root 917888 2010-08-11 04:47 /bin/bash
其中的rwxr-xr-x是权限信息,说明如图 3.23所示。
图3.23 文件访问权限示例
输出信息第一列表示文件访问权限,该示例详细说明
第一个字符是-,表示这是一个普通文件,如果是b则表示是块设备,是c则表示是字符设备,是d则表示是目录,是l则表示是链接文件,p表示命名管道,s表示Socket文件。
接下来的9个字符rwxr-xr-x,分成三组,各含义如表 3.10所示。
权限字符中,ls -l结果中,用r/w/x表示的则表示拥有相应的权限,用“-”表示的则表示没有相应的权限,拥有权限的用数字表示结果为“读/写/执行”3个数字相或得到,如rwx可用7表示,r-x可用5表示,rwxr-xr-x则可用755表示。
chmod用于改变或者设置文件/目录的权限。用法:
$chmod [参数] 文件/目录
设置或者改变文件/目录的权限,可直接用八进制表示,如将hello文件设置为任何人都可以读写并执行:
vmuser@Linux-host:
hello$ chmod 777 hello
更常用的是用字符方式设定文件/目录的权限,分别用u/g/o表示文件的拥有者/组内用户/其它用户,用rwx分别表示读/写/执行权限,用+/-表示增加或去除某种权限。例如,将hello文件的其它用户权限可执行属性去掉:
vmuser@Linux-host:
hello$ chmod o-x hello
如果同时设置u/g/o,可用a表示,例如为hello增加全部用户可执行权限:
vmuser@Linux-host:
~$ chmod a+x hello
拥有可执行权限的文件,在Linux 终端下通常呈现为绿 {MOD}。如果在运行程序的时候遇到permission dennied这样的错误提示,可在终端输入chmod +x file,为将要运行的程序增加可执行权限。
类似的命令还有chown改变文件属主和chgrp改变文件群组,用法请参考其它资料。
本文版权由致远电子(www.zlg.cn)周立功所有,请勿转载
往期连载:
【连载】嵌入式Linux开发教程:Linux内核
【连载】嵌入式Linux开发教程:Linux发行版
【连载】嵌入式Linux开发教程:嵌入式Linux的特点与产品形态
【连载】嵌入式Linux开发教程:获取Linux环境
【连载】嵌入式Linux开发教程:初始Ubuntu
【连载】嵌入式Linux开发教程:Linux
Shell