Linux命令行命令速查手册
【作者原创】Jan【ls】
2017-02-09ls命令会列出当前所在目录的内容2017-02-09ls music注 | 想要看看music目录中有什么内容,那么只需要输入ls命令,后面再跟上你想要查看其内容的文件夹名称 |
注 | 使用通配符只显示以.wmv结尾的文件 |
注 | 使用了通配符:只查找文件名包含tiger这个单词的文件 |
注 | -R选项会递归地遍历iso目录,显示iso目录和它的每个子目录的内容。每个文件夹都以原命令中指定的目录作为开始,显示为它们各自相对于该目录的路径,路径名称后面跟着一个冒号,接着再列出相应子文件夹中的所有内容 |
注 | 用单独一列的方式来查看ls命令的结果 |
注 | -m中的m看作是“,(逗号)”的助记符。 如果你正在编写脚本,需要以逗号分隔的列表来表示目录的内容时,这个选项也很有用。不过,这是这个有价值的选项更为高级的一种用法 |
注 | 查看这些隐藏文件,只要使用-a选项 ls -a[a代表all(所有)]命令既能显示隐藏内容,也能显示非隐藏内容 |
注 | 文件后面的“*”(星号)表示该文件是可执行文件,“/”(斜杠)表示它是一个目录。如果文件名后面没有任何附加符号,那这个文件就是一个普通的文件 |
注 | 可以让shell用不同的颜色显示内容,这样就能够用另一种方法把不同的内容进行分类,将它们区分开来 普通文件 绿色 可执行文件 蓝色 目录 紫红色 符号链接文件 黄色 管道(FIFO) 紫红色 套接字(socket) 红色 压缩文件(.tar、.zip、.deb、.rpm) 紫红色 图片文件(.jpg、.gif、.png、.tiff) 紫红色 音频文件(.mp3、.ogg、.wav) |
注 | 统为各种文件映射了什么颜色。 |
注 | 命令修改这些颜色配置 |
注 | -l选项代表long,可以看到,它提供了目录中文件的大量数据 |
注 | 以相反的顺序来排列显示内容。 -r表示反向,而-R则表示递归 |
注 | 对文件的扩展名进行字母顺序的排序。 如果你想按相反的顺序排序,只需加上-r选项。 |
注 | 按日期和时间对目录的内容进行排序,在-l选项的基础上使用-t选项。 |
注 | 使用-S(或--sort=size)选项按照文件大小来排序。 体积最大的文件会排在第一位。要按相反顺序排序,让体积最小的文件排在第一位,只需使用-r选项。 |
注 | 使用-h(或--human-readable)选项将字节转换为相应的千字节、兆字节或者吉字节显示。 |
【pwd】
2017-02-09pwd注 | 显示当前目录(或工作目录)的完整的绝对路径。 |
【cd】
2017-02-09cd注 | 切换到一个新目录。 只需输入cd,后面跟着你想要切换到的目录。你可以基于当前路径使用相对路径(例如,cd src或cd../../);或者使用绝对路径(例如,cd/tmp或cd/home/scott/bin) |
注 | 立即返回到home目录。 |
注 | 返回到以前的目录,然后再运行pwd命令,显示出新位置。 $ pwd /home/scott $ cd music/new $ pwd /home/scott/music/new $ cd - /home/scott |
【touch】
2017-02-09touch注 | 创建一个新的空文件,更新访问或修改时间。 touch存在的主要目的是更新文件访问和修改时间。 如果你只想更新访问时间,就可以使用-a选项(或--time=access)。如果只想更新修改时间,则使用-m(或--time=modify)。 |
注 | 只要使用这个选项和一定的模式,就可以修改任何日期和时间:-t [[CC]YY]MMDDhhmm[.ss] CC 4位年份数字中的前2位字符 YY 2位数字的年份: ·如果是00~68,则假设年份的前2位数字是20 ·如果是69~99,则假设年份的前2位数字是19 ·如果什么也没有,则假设是当前年份 MM 月份(01~12) DD 日期(01~31) hh 小时(01~23) mm 分钟(00~59) ss 秒(00~59) 完整的4位数字的年份(1970)、月(02)、日期(16)、小时(07)、以及分钟(01) $ ls -l -rw-r--r-- 239 2005-10-19 14:00 wireless.log $ touch -t 197002160701 wireless.log $ ls -l -rw-r--r-- 239 1970-02-16 07:01 wireless.log $ touch -t 9212310000 wireless.log $ls -l -rw-r--r-- 239 1992-12-31 00:00 wireless.log $ touch -t 3405170234 wireless.log $ ls -l -rw-r--r-- 239 2034-05-17 02:34 wireless.log $ touch -t 10191703 wireless.log $ls -l -rw-r--r-- 239 2005-10-19 17:03 wireless.log |
【mkdir】
2017-02-09mkdir注 | 创建新的空文件夹,如果要创建的目录已经存在,命令执行将会失败,并返回一个警告信息。 |
注 | 在新的子目录的新子目录中再创建一个新的子目录。 |
注 | 能告诉你mkdir命令所执行的每一步操作,这样你就不需要再进行实际检查来确定mkdir命令是否正确完成了任务。 |
【cp】
2017-02-09cp注 | 将文件复制到另一个目录中,甚至可以从非当前工作目录复制到文件系统的其他任何目录。 |
注 | 用通配符一次将多个文件复制到目录中。精心命名文件,将非常节约时间,因为这样你可以准确地指定一组文件。 可以使用的通配符并不只限于“*”。实际上,还可以使用方括号([]),通过匹配“[”和“]”之间的任意字符来更准确地指定你想要复制哪些文件。 $ cp ~/pix/by_pool*.jpg . $ cp ~/pix/on_floor_0[1-3].jpg . |
注 | 增加-v选项(或--verbose),则可以在cp命令完成复制任务的同时显示其进度。 |
注 | 如果你需要在使用cp命令覆盖文件前得到预警,则可以使用-i选项(或--interactive)。 如果你想继续并复制这个文件,输入y,否则就输入n。如果你选择输入n,并不意味着cp命令会完全停下来,相反,它会询问你下一个文件如何处置,再下一个文件,直至最后。 |
注 | 复制目录,会自动把目录下的文件一并复制。 |
注 | cp命令也可以作为备份各种文件和目录的有效方法。在这种情况下最有用的选项就是-a选项(或--archive)。 -a选项可以确保cp命令不会复制符。 号链接的内容(否则可能会极大地增加复制量),只保存关键的文件属性(例如拥有者、时间戳),并递归处理子目录。 |
注 | mv命令实际上执行了一个cp-a操作,在成功复制文件后再移除原有的文件。 用最简单的话来说,mv命令的作用就是将文件系统的文件从一个地方移动到另一个地方。 -v可以在复制和移动文件时显示执行过程。 -i在复制和移动文件时交互式地提示是否覆盖已经有的文件。 它也可以用来重命名文件。 |
【rm】
2017-02-09rm注 | 这条命令会彻底地删除文件,文件将不复存在。 |
注 | 知道rm命令执行时到底在做什么,可以使用-v(或--verbose)选项。 $ pwd /home/scott/libby/by_pool/lieberman_pool $ ls pool_01.jpg pool_03.jpg pool_01.jpg_bak pool_03.jpg_bak $ rm -v *_bak removed 'pool_01.jpg_bak' removed 'pool_03.jpg_bak' $ ls pool_01.jpg pool_03.jpg |
注 | -i选项(或--interactive)可以提供一定的安全机制。在删除每个文件之前,它会先询问你是否要删除。当你作为root用户运行系统的时候,这可是个好东西! 当rm命令询问你要如何做的时候,y表示同意删除文件,n表示忽略这个文件,并继续处理下一个文件。 |
注 | 删除非空目录,还有一种更为简单的方法: 把-R(或--recursive)和-f(或--force)选项结合起来使用。 -r选项告诉rm命令进入到它发现的每个子目录中去删除文件。 -f选项只是告诉rm命令完成任务但不要因为些细节问题(比如文件夹非空)而烦扰用户。 当作为root登录时,不要输入rm -Rf /*命令。这样你将删除你的系统。你会觉得很糟糕,觉得这样做很傻。 删除Cousin Harold.jpg的带空格的文件名并不太难。只需要将文件的名称用双引号括起来就可以了。 $ rm "cousin harold.jpg" 在有问题的文件名称的前面放“--”,它会告诉命令:跟在后面的任何东西都不能作为选项,而是文件或文件夹的名称。 $ rm -- -cousin_roy.jpg $ rm ./-cousin_roy.jpg |
【su】
2017-02-09su username注 | su命令代表“switch user”(切换用户),并不是大多数人想象的“super user”(超级用户),能够让某个用户暂时以另一个用户的身份进行操作。 快速切换用户。 $ ls /home/scott/libby $ whoami scott $ su gromit Password: $ whoami gromit $ ls /home/scott/libby |
注 | 它只是告诉你你是谁(就shell关心的用户来说)。这里用它来检验su命令是否按你所期待的那样工作。 |
注 | 变更到其他用户,包括其环境变量。 -l选项告诉su命令使用一个登录shell,好像gromit真正登录到机器中一样。现在你用的是gromit的名字,使用的也是gromit的环境变量,还位于gromit的home目录(就是gromit初次登录到这台机器后所在的位置)。 |
注 | 变更成root用户。 你可以使用su root,或者更好一些,使用su -l root,但是还有一种更快捷的方法: $ whoami scott $ su Password: $ whoami root |
注 | 当使用su -时,不但用户变更成了root,而且还使用了root的环境变量。 在su后面附加“-”与su -l root的效果相同,但是输入的字符少一些。 |
【man】
2017-02-09man ls注 | 假设你想查ls命令的更多信息,输入man ls,就会打开man page(man是manual的缩写,因此man page就是“手册页面”),显示关于ls命令各个方面的信息。 一次向下移动一行,使用向下的箭头键;一次向上行一行,使用向上的箭头键。向下翻动一页,按空格键或者f[代表“forward(向前)”];向上翻动一页,按b键[代表“backward(向后)”]。 输入“/”,后面跟上搜索的词语,然后按Enter(回车)键。如果搜索的词语存在,页面就会跳转到相应的位置;如果要跳转到下一个搜索结果,再按一次Enter键(或者n键),然后一直按Enter键(或者n键)以便在屏幕上查看找到的每个搜索信息;按Shift+n,返回。 |
注 | 假设你对命令能完成的功能有点了解,但不知道命令的实际名称,该怎么办呢?这时可以试试-k选项(或--apropos),搜索一个描述你想找的那种命令的词或短语。 $ man -k list last (1) - show listing of last logged in users ls (1) - list directory contents lshal (1) - List devices and their properties lshw (1) - list hardware lsof (8) - list open files [Listing condensed due to length] |
注 | 使用-f选项(或--whatis),就可以看到这个命令的简单说明。 $ man -f ls ls (1) - list directory contents |
注 | man命令偶尔可能会报告并没有该命令的页面。在放弃查找之前,还可以再试试-u选项(或--update),这个选项强制man命令重建它使用的命令数据库和man page。 |
注 | 要查看passwd文件特定的man page,需要为man命令提供你想查看的数据所属于的区段序号。 $ man 5 passwd (1)普通命令,如cd、chmod、lp、mkdir和passwd。 (2)由内核提供的底层系统调用,如intro和chmod。 (3)C库函数,如beep、HTML::Parser和Mail::Internet。 (4)特殊文件,如/dev中找到的设备,包括控制台(console)、打印机(lp)和鼠标(mouse)。 (5)文件格式和约定,如apt.conf、dpkg.cfg、hosts和passwd。 (6)游戏,如atlantik、bouncingcow、kmahjongg和rubik。 (7)杂项,包括宏包(macro package)。如ascii、samba和utf-8。 (8)root用户使用的系统管理命令,如mount和shutdown。 |
注 | $ man -t ls | lpr -P hp_laserjet 假设有一台打印机已经连接到系统中,并将它标记为hp_laserjet。要将ls命令的man page直接用这个打印机打印,就需要使用-t选项(或--troff),再通过管道(pipe)输出至lpr命令,并在lpr命令中用-P选项来标识相应的打印机。 $ man -t ls > ls.ps && ps2pdf ls.ps && rm ls.ps 如果处理过程成功完成,就可以使用ps2pdf命令将PostScript文件转换为PDF文件。转换正常完成后,可以删除掉原来的PostScript文件,因为不再需要它了。 |
【info】
2017-02-09info注 | Info页面,它使用Info命令查看。 $ info info 这就打开了info命令的Info页面。 如果想一次向下移动一个页面,可以使用键盘的PageDown键;一次向上移动一个页面,则使用PageUp键。但是你不能离开所在的特定区段。 如果到达区段的底部时想跳回到顶端,只需要按b(代表beginning)就能够回到开始的位置。同样,按e(代表end)则是跳回到底部。 可以使用空格键向下翻页。 如果在Info中迷失方向,需要帮助,只需要随时按“?”键,窗口的下半部分就会显示Info的各种选项。可以使用前面学过的键盘操作来上下移动。要退出帮助,按l。 最后,或许也是最重要的一点,要完全退出Info,只需要按q(表示quit),就能够返回到shell中。 |
注 | 查看命令的可执行程序、它的源文件(如果存在的话)及其man page的路径。 $ whereis kword kword: /usr/src/koffice-1.4.1/kword /usr/bin/kword/usr/bin/X11/kword usr/share/man/man1/kword.1.gz whereis命令首先报告源文件的位置/usr/src/koffice-1.4.1/kword。接着报告任何可二进制可执行文件的位置/usr/bin/kword和/usr/bin/X11/kword。在这台计算机的两个位置都能找到KWord,虽然有些不寻常但还不算奇怪。最后找到的是man page的位置/usr/share/man/man1/kword.1.gz。 如果只想搜索二进制文件,可以使用-b选项,如下所示: $ whereis -b kword kword: /usr/bin/kword /usr/bin/X11/kword 如果只想搜索man page,使用-m选项,如下所示: $ whereis -m kword kword: /usr/share/man/man1/kword.1.gz 最后,如果只想搜索源文件,可以尝试-s选项,如下所示: $ whereis -s kword kword: /usr/src/koffice-1.4.1/kword whereis命令是一种非常好用的快捷方法,可以找到你正在使用的计算机中程序的重要信息。你会发现它的用处超乎你的想象。 |
注 | 显示命令的man page的描述。 $ man -f ls ls (1) - list directory contents $ whatis ls ls (1) - list directory contents $ whatis -w ls* ls (1) - list directory contentslsb (8) - Linux Standard Base support for Debian lshal (1) - List devices and their properties lshw (1) - list hardware lskat (6) - Lieutnant Skat card game for KDE [Listing condensed due to length] whatis命令便于记忆(至少要比man -f更容易),而且它还能快速返回一些重要信息,因此一定要记住它。 |
注 | 与man -k类似。这两个命令都能够在man page中搜索命令的名称和描述,当你只记得命令的功能而不记得具体名称时,就可以为你提供帮助。 $ man list No manual entry for list $ man -k list last (1) - show listing of last logged in users ls (1) - list directory contents lshw (1) - list hardware lsof (8) - list open files [Listing condensed due to length] $ apropos list last (1) - show listing of last logged in users ls (1) - list directory contents lshw (1) - list hardware lsof (8) - list open files [Listing condensed due to length] 如果只想密切关注某个词或者短语,没有任何其他内容,则可以使用-e选项(或--exact)。 $ apropos -e list ls (1) - list directory contents lshw (1) - list hardware lsof (8) - list open files [Listing condensed due to length] |
注 | $ which kword /usr/bin/kword 只要输入命令的名称,which命令就能告诉你这个命令的哪个版本将会运行。换句话说,如果你输入kword,然后按Enter键,shell将会执行/usr/bin目录下找到的kword程序。 which命令也是一种快速判断系统中是否存在特定命令的方法。 如果要查找命令的所有位置(就像使用whereis -b一样),则可以使用-a(表示all)选项。 $ which -a kword /usr/bin/kword /usr/bin/X11/kword |
【特殊符号】
2017-02-09;注 | 命令栈(command stacking)可以解决这一问题。 命令栈是将所有需要运行的命令放到shell的一行上,再用分号(;)隔开每个具体的命令。接着依次顺序执行每个命令,只有一个命令结束运行(无论成功或失败),才会运行下一个命令。 $ ls -l /home/scott/music -rw-r--r-- 1437931 2005-11-07 17:19 JohnColtrane.zip $ unzip /home/scott/music/JohnColtrane.zip ; →mkdir -p /home/scott/music/coltrane ; →mv /home/scott/music/JohnColtrane*.mp3 →/home/scott/music/coltrane/ ; →rm /home/scott/music/JohnColtrane.zip |
注 | 【只有前面的命令运行成功,才运行下一个命令】 分隔命令的一个更好的办法就是用&&,它同样也是依次顺序运行每个命令,但只有当前面一条命令运行成功之后,才能执行下一条命令[从技术上讲,每条命令返回的退出状态(exit status)码必须为0,才能运行下一条命令]。如果一条命令运行失败,整个命令链就会停下来。 $ unzip /home/scott/JohnColtrane.zip && →mkdir -p /home/scott/music/coltrane && →mv /home/scott/music/JohnColtrane.*mp3 →/home/scott/music/coltrane/ && →rm /home/scott/music/JohnColtrane.zip |
注 | 【只有前面的命令运行失败,才运行下一个命令】 |
注 | 将一个命令的输出插入到另一个命令。 $ pwd /home/scott/photos/family $ ls -1F 2005-11-01/ 2005-11-09/ 2005-11-15/ $ date “+%Y-%m-%d” 2005-11-24 $ mkdir $(date “+%Y-%m-%d”) $ ls -1F 2005-11-01/ 2005-11-09/ 2005-11-15/ 2005-11-24/ |
注 | 管道就是键盘上的“|”符号,当把它放在两个命令之间时,它可以将第一个命令的输出作为第二个命令的输入。换句话说,|重定向stdout,将它发送到第二个命令的stdin。 $ ls -1 zipinfo zipnote zipsplit zsoelim zxpdf [Listing truncated due to length - 2318 lines!] $ ls -1 | less 411toppm 7z 7za 822-date a2p |
注 | 使用>(大于号)字符将输出存到文件中。 $ pwd /home/scott/music $ ls -1F Hank_Mobley/ Horace_Silver/ John_Coltrane/ $ ls -1F Hank_Mobley/* > hank_mobley.txt $ cat hank_mobley.txt 1958_Peckin'_Time/ 1960_Roll_Call/ 1960_Soul_Station/ |
注 | 使用>>来代替>,就会把输出追加到指定文件的底部,如果文件不存在,就会创建它。 $ cat hank_mobley.txt Mon Nov 21 21:33:58 CST 2005 $ ls -1F Hank_Mobley/* >> hank_mobley.txt $ cat hank_mobley.txt Mon Nov 21 21:33:58 CST 2005 1958_Peckin'_Time/ 1960_Roll_Call/ 1960_Soul_Station/ 1961_Workout/ 1963_No_Room_For_Squares/ |
注 | 将文件作为命令的输入 $ echo < hank_mobley.txt Mon Nov 21 21:33:58 CST 2005 1958_Peckin'_Time/ 1960_Roll_Call/ 1960_Soul_Station/ 1961_Workout/ 1963_No_Room_For_Squares/ |
【cat】
2017-02-09cat注 | cat命令将文件打印到屏幕,然后直接返回到命令提示符。如果文件长度超出屏幕的范围,必须向上滚动才能看到刚才一闪而过的内容。 $ cat Hopkins_-_The_Windhover.txt |
注 | cat命令将两个文件糅合在一起,再显示出来 $ cat housman_-_rue.txt quarles_-_the_world.txt |
注 | 将两个文件拼接起来,最好还能将新连接的文件保存成另一个可以使用的文件。 $ cat housman_-_rue.txt quarles_-_the_world.txt > poems.txt |
注 | 使用cat命令时想生成行号,可以增加-n选项(或--number)。 $ cat -n housman_-_rue.txt quarles_-_the_world.txt 1 WITH rue my heart is laden 2 For golden friends I had, 3 For many a rose-lipt maiden 4 And many a lightfoot lad. 5 By *s too broad for leaping 6 The lightfoot boys are laid; |
【less】
2017-02-09less file1注 | 分屏查看文本文件。 less命令是分页器的一个例子,分页器是一个可以分页显示文本文件内容的程序。 $ less Paradise_Lost.txt $ less -N Paradise_Lost.txt PageDn、f或空格键 前进一页 PageUp或b 后退一页 Return、e、j或下箭头键 前进一行 y、k或上箭头键 后退一行 G或p 前进到文件的结尾 1G 回到文件的开始 Esc-)或右箭头键 向右滚动 Esc-(或左箭头键 向左滚动 Q 退出less |
【head】
2017-02-09head注 | head命令可以只打印出文件的前10行内容,然后返回到命令行。 $ head Canterbury_Tales.txt Here bygynneth the Book of the Tales of Caunterbury General Prologue Whan that Aprill, with his shoures soote |
注 | head命令一次查看多个文件的前10行内容。 $ head Canterbury_Tales.txt Paradise_Lost.txt 查看一个或多个文件的前几行内容 $ head -n 5 Canterbury_Tales.txt |
注 | 查看文件前面一定字节数量的内容 $ head -c 100 Canterbury_Tales.txt |
【tail】
2017-02-09tail注 | tail命令来查看一个文件最后10行的内容。 $ tail Paradise_Lost.txt 通常,查看日志(log)文件的最后几行内容,才能发现应用程序或者系统的最新运行状况。 |
注 | tail命令也可以一次查看多个文件的前10行内容 $ tail Paradise_Lost.txt Miller's_Tale.txt |
注 | 也可以使用-n(或--lines=)选项来指定想要查看的文件行数。 $ tail -n 4 Paradise_Lost.txt |
注 | $ tail -f --pid=PID# terminates after PID dies. 再次查看日志文件,不断地运行tail命令。 使用-f(或--follow)选项,tail命令就不会自动关闭了。每当文件发生变化时,它就会显示文件的最后10行。 可以观察到日志文件随时发生的所有变化。 |
【lp*】
2017-02-09lpstat -p注 | 先知道系统中已经安装了哪些打印机。要找到在系统中配置好的打印机,可以使用带有-p选项的lpstat(line printer status的缩写)命令。 $ lpstat -p |
注 | 找出默认的打印机,可以使用带有-d(表示default)选项的lpstat命令。 $ lpstat -d |
注 | 笔记本计算机用户将会发现接下来介绍的这个命令非常有用,因为它能够告诉他们如何访问可用的打印机。 找出计算机上配置了哪些打印机,以及如何连接到这些打印机,可以使用带有-s选项的lpstat命令。 $ lpstat -s 本质上复制了lpstat -p -d的功能,除了默认打印机以外,它也列出了系统中能识别出的所有打印机。如果你想快速获取打印机的所有信息,这是一个非常好用的命令。 |
注 | 一次获取打印机的所有信息,则可以使用带有-t选项的lpstat命令,它可以将lpstat知道的打印机的所有信息都显示在shell中。 $ lpstat -t 信息为:默认的打印机、系统能识别的所有打印机列表、打印机的连接方法和位置及所有打印机的状态。 |
注 | 打印到默认的打印机(由lpstat -d决定的那个打印机)很容易。 $ lpr Lovecraft_-_Call_of_Cthulhu.txt 即只有lpr和文本文件的名称。 |
注 | 把文件打印到某个非默认打印机上,使用-P选项,后面跟上那个打印机的名称也很容易。 $ lpr -P bro_wk Lovecraft_-_Call_of_Cthulhu.txt |
注 | 打印多份文档,可以使用-#(井字符号)选项,后面跟上你需要打印的份数: $ lpr -# 2 -P bro Lovecraft_-_Call_of_Cthulhu.txt 份数只可以是从1到100的任何数字。 |
注 | lpq命令(表示“lp queue”)用于列出默认打印机上正在打印的所有任务。 $ lpq 查看所有打印机上打印队列的状态,而不只是默认打印机的队列。 $ lpq -a |
注 | 结果显示的是一列打印任务,在每一行的开始显示的是正在处理打印任务的打印机的名称。 $lpstat |
注 | 取消发送到默认打印机上的当前打印任务。 $ lprm |
注 | 在lprm命令中指定这个编号,就可以精确地删除相应的打印任务。 $ lpstat bro-489 rsgranne 108544 Tue 10 Dec 2005 bro_wk-490 rsgranne 524288 Tue 10 Dec 2005 $ lprm 490 $lpstat bro-489 rsgranne 108544 Tue 10 Dec 2005 |
注 | 取消多个打印任务。 $ lprm 489 490 491 492 493 删除每台打印机队列中的所有的打印任务 $ lprm - |
【chgrp】
2017-02-09chgrp注 | 当你创建一个新的文件(或目录)时,默认的拥有者和用户组就是你自己。 让该组的其他成员也能够使用你的脚本,并能够运行它,在这种情况下,就需要使用chgrp命令将用户组从scott修改为admins。 $ chgrp admins new_script.sh $ ls -l -rw-r--r-- 1 scott admins ... script.sh 当运行chgrp命令时,可以使用用户组的名称或数字ID。但是如何找到与某个用户组相关的数字ID呢?最简单的方法就是对/etc/group使用cat命令,这个文件保存了计算机中各个用户组的信息。 只有用户组的成员,才能够修改这个组的权限。 |
注 | 修改目录中多个文件的用户组,可以使用通配符。如果要修改目录中所有文件及其所有子目录中文件的用户组,则可以使用-R(或--recursive)选项。 $ pwd /home/scott/pictures/libby $ ls -F by_pool/ libby_arrowrock.jpg libby.jpg on_floor/ $ ls -lF * -rw-r--r-- 1 scott scott ... libby_arrowrock.jpg $ chgrp -R family */* $ ls -l * -rw-r--r-- 1 scott family ... libby_arrowrock.jpg |
注 | 想知道chgrp命令运行过程中发生了什么,可以先试试-v(或--verb-bose)选项。它可以告诉你chgrp命令在每一步中执行了什么任务。 $ chgrp -v family * |
注 | 使用-c(或--changes)选项,毫无疑问,它只会显示修改过的内容。 $ chgrp -c family * |
【chown】
2017-02-09chown注 | 修改拥有者则应该使用chown命令。 $ chown denise libby.jpg 用户的数字ID可以通过运行cat/etc/passwd命令来查看。 bind:x:110:118::/var/cache/bind:/bin/false scott:x:1001:1001:Scott,,,:/home/scott:/bin/bash ntop:x:120:120::/var/lib/ntop:/bin/false 第一个数字是用户的数字ID(第二个数字是与用户相关联的主用户组的数字ID)。 |
注 | 可以用chgrp命令修改用户组,用chown命令修改拥有者,但是用chown命令也可以同时实现这两个功能。 $ chown denise:family libby.jpg $ chown :family libby.jpg 如果用户或用户组的名称中有冒号怎么办?只要在冒号前面输入反斜杠字符(\)就可以。 $ chown denise:family\:parents libby.jpg |
【chmod】
2017-02-09chmod [ugo][+-=][rwx]注 | 字母表示法基本上使用一个简单的公式:想要修改的用户组(u、g、或者o),后面用加号(+)来授予权限、用减号(-)来删除权限、用等号(=)来设置完全匹配的权限,后面再跟上表示想要修改的权限的字母(r、w、x、s、或者t)。 $ ls -l -rw-r--r-- 1 scott family ... libby.jpg $ chmod g+w libby.jpg $ ls -l -rw-rw-r-- 1 scott family ... libby.jpg |
注 | 数字权限(也称为八进制权限)是基于二进制数字系统而创建的。 读(read, r)的值为4,写(write, w)的值为2,而执行(execute, x)的值是1。 chmod 664 -rw-rw-r-- 所有人都能读,但只有拥有者和组用户能够编辑。 $ ls -l -rw-r--r-- 1 scott family ... libby.jpg $ chmod 664 libby.jpg $ ls -l -rw-rw-r-- 1 scott family ... libby.jpg |
注 | 使用-R(或--recursive)选项能够在短时间内修改数百个文件系统对象的权限。 $ chgrp -R family * $ chmod -R 660 * |
注 | 用于设置和取消suid,即字母表示法和数字表示法。字母表示法如下所示: $ pwd /home/scott/bin $ ls -l -rwxr-xr-- 1 scott admins ... backup_data $ chmod u+s backup_data $ ls -l -rwsr-xr-- 1 scott admins ... backup_data 使用u-来代替u+即可删除suid。 $ ls -l -rwsr-xr-- 1 scott admins ... backup_data $ chmod u-s backup_data $ ls -l -rwxr-xr-- 1 scott admins ... backup_data |
注 | 可以使用字母表示法或数字表示法设置sgid。使用字母时,设置sgid与设置suid类似,只是这里使用的是g,而不是u。 $ ls -lF drwxr-xr-x 11 scott admins ... bin/ $ chmod g+s bin $ ls -lF drwxr-Sr-x 11 scott admins ... bin/ 删除sgid的方法和删除suid的方法是一样的,在开头输入0,就去掉了sgid权限。 $ ls -lF drwxr-Sr-x 11 scott admins ... bin/ $ chmod 0755 bin $ ls -lF drwxr-xr-x 11 scott admins ... bin/ |
注 | 如果可执行文件设置了sticky bit,OS就会知道这个文件将需要不断地运行,所以就把它保存在交换区,以便能够快速而有效地访问它。 也可以使用字母表示法或者数字表示法设置sticky bit。 $ ls -lF drwxrwxr-x 2 scott family ... libby_pix/ $ chmod +t libby_pix $ ls -lF drwxrwxr-t 2 scott family ... libby_pix/ 删除sticky bit的操作应该与你想象的一样直接。 $ chmod -t libby_pix |
【zip】
2017-02-09zip注 | zip既可以对文件进行归档,也可以对文件进行压缩,这样有利于将多个文件作为电子邮件的附件发送、备份文件,或节约磁盘空间。 $ zip grandpa.zip young_edgar_scott.tif adding: young_edgar_scott.tif (deflated 19%) $ ls -lh -rw-r--r-- scott scott 1006K young_edgar_scott.tif -rw-r--r-- scott scott 819K grandpa.zip →grandpa.zip 不管压缩一个文件、多个文件,还是目录,用法模式都是相同的:zip命令,后面跟着想要创建的Zip文件的名称,最后是想要加到Zip文件的项目内容。 |
注 | 0表示“一点也不压缩”(和tar相似,稍后会看到),1表示“尽快完成压缩,而不需要压缩太多”,9表示“尽可能压缩文件,不介意会为此等待较长的时间”。默认值是6,但现在的计算机速度已经足够快,一直使用9表示的压缩率也不会有什么问题。 $ zip -0 moby.zip *.txt |
注 | .bashrc文件中为zip命令定义一个别名,如下所示: alias zip='zip -9 就能一直使用-9的压缩率,而不用再刻意考虑它了。 |
注 | Zip程序允许使用-P选项对生成的Zip文档增加密码保护。但是不应该使用这个选项,因为它一点儿也不安全,如下所示(实际密码是12345678): $ zip -P 12345678 moby.zip *.txt 真正输入的密码消失得无影无踪,任何查看shell历史记录的人都看不到。 $ zip -e moby.zip *.txt Enter password: Verify password: |
注 | 解压这些压缩文档使用的则是unzip命令。 $ unzip moby.zip unzip命令可以提供运行时的情况。要获得更多的信息,可以加上-v选项。 |
注 | 使用-l(代表list)选项就可以不解压文件而列出某个zip文件的内容。 $ unzip -l moby.zip Archive: moby.zip Length Date Time Name ------ ---- ---- ---- 0 01-26-06 18:40 bible/ 207254 01-26-06 18:40 bible/genesis.txt |
注 | 在实际解压文档之前,用-t(代表test)选项对文档进行测试。 $ unzip -t moby.zip Archive: moby.zip testing: bible/ OK testing: bible/genesis.txt OK testing: bible/job.txt OK testing: moby-dick.txt OK testing: paradise_lost.txt OK No errors detected in compressed 在每次处理zip压缩文档时,都应该使用-t选项。这是种明智的做法,虽然可能要多花些时间,但是值得这样做。 |
【gzip】
2017-02-09gzip注 | 使用gzip时,可以只输入命令和需要压缩的文件名。 $ gzip paradise_lost.txt 最终得到的只是新创建的压缩文件,原始文件不存在了。 如果想让gzip保留原始文件,则需要使用-c(或--stdout或--to-stdout)选项,它可以将gzip的结果输出到shell,但还需要将输出重定向到另一个文件。 $ gzip -c paradise_lost.txt > paradise_lost.txt.gz |
注 | gzip可以压缩子目录,则需要在使用通配符的同时,使用-r(或--recursive)选项。 $ gzip -r * |
注 | 0表示“一点也不压缩”(和tar相似,稍后会看到),1表示“尽快完成压缩,而不需要压缩太多”,9表示“尽可能压缩文件,不介意会为此等待较长的时间”。默认值是6,但现在的计算机速度已经足够快,一直使用9表示的压缩率也不会有什么问题。 如果想要更灵活些,可以在.bashrc文件中为gzip命令定义一个别名,如下所示: alias gzip= ' gzip -9 ' 这样一来,就能总是使用-9的压缩率,而不用再刻意考虑它了。 |
注 | 解压gzip压缩的文档。 gunzip也会删除.gz文件,只保留最终gunzip解压的结果。 如果确实需要保留二者,则需要使用-c选项(或--stdout或--to-stdout),将结果通过管道输出到想要创建的文件。 $ gunzip -c paradise_lost.txt.gz > paradise_lost.txt 如果你不喜欢使用gunzip命令,也可以使用gzip -d(或--decompress或--uncompress)。效果一样。 |
注 | 验证一下文件能否正确解压,所有文件都不会有任何损坏。为此,可以使用-t(或--test)选项。 $ gzip -t paradise_lost.txt.gz |
【bzip2】
2017-02-10bzip2注 | bzip2也只保留最终生成的.bz2文件,原始的moby-dick.txt文件将不复存在。若要保留原始的文件,可以使用-c(或--stdout)选项,并将结果通过管道输出到文件名以.bz2结尾的文件中。 $ bzip2 -c moby-dick.txt > moby-dick.txt.bz2 |
注 | 0表示“一点也不压缩”(和tar相似,稍后会看到),1表示“尽快完成压缩,而不需要压缩太多”,9表示“尽可能压缩文件,不介意会为此等待较长的时间”。默认值是6,但现在的计算机速度已经足够快,一直使用9表示的压缩率也不会有什么问题。 $ bzip2 -c -9 moby-dick.txt > moby-dick.txt.bz2 如果想要更灵活些,可以在.bashrc文件中为bzip命令定义一个别名,如下所示: alias bzip2='bzip2 -9' 这样一来,就能意是便用-9的压缩率,而不用再刻意考虑它了。 |
注 | bzip2在设计上有意要尽可能地模仿gzip一样,bunzip2和gunzip的工作原理也非常相似。 $ bunzip2 -c moby-dick.txt.bz2 > moby-dick.txt 如果你不喜欢使用bunzip2,也可以使用bzip2 -d(或—decomp-ress或--uncompress)。 |
注 | 验证一下文件能否正确解压,所有文件都不会有任何损坏。可以使用-t(或--test)选项完成这个操作。 $ bunzip2 -t paradise_lost.txt.gz |
【tar】
2017-02-10tar -cf注 | tar不能进行压缩,只进行归档。 -c(或--create)选项告诉tar正在创建一个tarball,而-f(或--file)选项则用于为tarball指定文件名。 tar会保留原始的文件。 $ tar -cf moby.tar *.txt tar命令真正令人称道的地方是,它可以用于压缩整个目录结构,所以能用它来批量归档大量的文件和子目录。 $ tar -cf moby.tar moby-dick/ |
注 | 首先使用tar命令对目录及其内容(位于各个子目录中的100个文件)进行归档,然后再使用gzip或bzip2对生成的tarball文件进行压缩。因为gzip是与tar配合使用时最常用的压缩程序。 $ tar -cf moby.tar moby-dick/ | gzip -c > moby.tar.gz |
注 | tar命令的两个新选项:-z(或--gzip)选项,能够在tar中调用gzip,这样就不需要手工调用了;-v(或--verbose)选项,虽然在此处并不真正需要,但总是有一定用处,因为它可以在tar运行时通知其运行状况。 $ tar -zcvf moby.tar.gz moby-dick/ 用tar和gzip归档和压缩文件,最终的文件扩展名是.tar. gz。 |
注 | 让tar与bzip2配合使用,命令的用法如下所示(注意-j选项,它正是引入bzip2的关键): $ tar -jcvf moby.tar.bz2 moby-dick/ 在这个例子中,最终生成的文件扩展名应该是.tar.bz2。 |
注 | 测试tarball(再次假设还用gzip压缩的),可以使用-t(或--list)选项。 $ tar -zvtf moby.tar.gz 这样就可以知道每个文件的权限、所有者、大小以及创建时间等信息。 要确保-f是最后一个选项,因为在它后面需要指定.tar.gz文件的名称;否则,tar会报错: $ tar -zvft moby.tar.gz tar: You must specify one of the '-Acdtrux' options Try 'tar --help' or 'tar --usage' for more information. |
注 | 解开并解压生成的tarball,只需要替换其中的一个选项,即用-x(或--extract)替换-c(或--create)。 $ tar -zxvf moby.tar.gz 在打开文件之前,要确保对它进行测试,这意味着运行的命令的顺序将如下所示: $ tar -zvtf moby.tar.gz $ tar -zxvf moby.tar.gz |
【locate】
2017-02-10locate注 | 知道文件的名称,或者名称的一部分,但不记得放在系统的哪个位置。这就是locate命令要解决的问题。 locate命令能够在文件、程序和目录中查找与提供的搜索项匹配的内容,并把任何匹配的结果依次显示到终端界面上。 $ locate haggard 注意,第一次搜索是以普通用户的身份执行的,而不是root用户,搜索将失败。使用su命令成为root用户,再次运行locate命令,这次就成功了。 $ locate slocate.db $ su - # locate slocate.db |
注 | 可以加上-i选项,这样执行的就是不区分大小写的搜索。 $ locate -i haggard 当需要让locate命令返回更多的结果时,要记得使用-i选项;否则,可能会遗漏很多你想要找到的重要文件和文件夹。 |
注 | 将locate搜索结果通过管道输出至分页器less命令。 |
注 | 如果只想看前面的x个结果(x是你选择的一个整数),则可以使用-n选项,后面跟着你想要看的结果个数。 $ locate -n 3 pdf /etc/cups/pdftops.conf /etc/xpdf /etc/xpdf/xpdfrc-latin2 |
【updatedb】
2017-02-10updatedb注 | # apt-get install rkhunter # exit $ locate rkhunter $ su - # updatedb # exit $ locate rkhunter /usr/local/rkhunter /usr/local/rkhunter/bin /usr/local/rkhunter/etc 在上述命令中,首先安装了rkhunter(Rootkit Hunter的程序包名),然后退出root。之后搜索rkhunter,但没有结果。再成为root用户,运行updatedb,扫描硬盘空间,让locate数据库知道新发生的任何变化,然后退出root。最后再使用locate搜索rkhunter,这次就搜索到了。 实际上,updatedb命令与slocate -u完全相同,而且updatedb实际上只是一个指向slocate的链接。 |
注 | 在updatedb处理完成以后,time命令就能显示整理好locate数据库花费了多长时间。这个信息很有用,需要记住,可能以后会需要使用updatedb而时间又很紧。 |
【grep】
2017-02-10grep注 | 搜索文件内容,应该使用grep命令。grep的处理过程基本上就是,为它提供一个搜索想要匹配的模式,指定要搜索的一个或一组文件(甚至是整个硬盘空间)。 $ grep pain three_no_more_forever.txt all alone and in pain 一次进行多内容搜索。 $ grep pain * |
注 | 单引号('和')是在告诉shell正在搜索一个字符串,而双引号("和")则是让shell知道想要使用shell变量。 $ grep 'hey!' * txt/pvzm/8 hours a day.txt:hey you! let’s run! 结果好多了。单引号告诉grep搜索内容不包含任何shell变量,只是一串需要匹配的字符。 如果要搜索精确的匹配结果,就使用单引号; 如果要把shell变量结合到搜索内容中(很少有这样的需要),就使用双引号; 但如果搜索关键字只包含数字和字母,完全不使用任何引号也没有问题。 |
注 | 搜索多个子目录,就需要使用-R(或--recursive)选项。 $ grep -R hideous * 在一组文件中搜索一下hideous这个词。 $ grep -R hideous *| less 管道分屏。分屏中命令方便查看。 $ grep -R hideous * > hideous_in_horror.txt 重定向输出到文件。保存备用。 |
注 | 能够把这两种结果组合起来,使用-i(或--ignore-case)选项就能同时搜索二者。 $ grep -i hideous h_p_lovecraft/* |
注 | 只需要精确匹配pain的行,这时就要使用-w(或--word-regexp)选项。 $ grep -w pain * |
注 | grep命令能够显示包含正在搜索内容的那一行,但并不能指出在文件中的哪个位置能够找到那行信息。要找到行号,可以利用-n(或--line-number)选项。 $ grep -n pain * |
注 | 将ls -1的结果通过管道输出到grep,几秒钟内就能得到答案。如下所示: $ ls -1 | grep 1960 1960_Coltrane_Plays_The_Blues 1960_Coltrane's_Sound 1960_Giant_Steps 1960_My_Favorite_Things |
注 | ps命令可以列出运行中的进程,而-f选项能够让ps提供完整的列表,其中包括每个进程的很多信息;而-U选项,后面跟上用户名称,可以限制只输出那个用户拥有的进程。 $ ps -fU scott | grep firefox scott 17623 /bin/sh /opt/firefox/firefox scott 17634 /opt/firefox/firefox-bin scott 1601 grep firefox 要在grep结果中隐藏firefox的搜索信息,试试以下命令: $ ps -fU scott | grep [f]irefox scott 17623 /bin/sh /opt/firefox/firefox scott 17634 /opt/firefox/firefox-bin 现在,grep的搜索内容是通过正则表达式的一个范围(从f到f)来定义的,用它可以找到ps输出中包含firefox的那些行(表示相应的进程正在运行Firefox)。 |
注 | grep可以输出包含搜索内容的实际行,但也可以让grep输出匹配内容之前和之后的若干行。 如果要找出A Love Supreme之后的唱片,则应该使用-A(或--after-context=#)选项。 $ ls -1 | grep -A 3 这个专辑之前的三个专辑又是什么呢?使用-B(或--before-context=#)选项。 $ ls -1 | grep -B 3 A_Love_Supreme 要得到A Love Supreme专辑的完整历史背景,则可以试试-C(或--context=#)选项,它可以把该专辑之前和之后的内容都组合在一起。 $ ls -1 | grep -C 2 如果结合-n选项,结果中的信息将更有用,该选项可以列出行号(因为这里使用的是ls -1,所以它是ls结果列表中的行号)。 冒号(:)表示该行是匹配行,而连字符(-)则表示该行是匹配行之前或之后的行。 |
注 | 如果你想查看一组包含Led Zeppelin专辑的MP3文件夹,但不包括那些标题中含有Led Zeppelin一词的专辑,该怎么做呢?使用-v(或--invert-match)选项,就可以只显示与给定模式不匹配的结果了。 $ ls -1 1969_Led_Zeppelin 1969_Led_Zeppelin_II 1970_Led_Zeppelin_III 1971_Led_Zeppelin_IV 1973_Houses_Of_The_Holy 1975_Physical_Graffiti 1976_Presence 1979_In_Through_The_Out_Door 1982_Coda $ ls -1 | grep -v Led_Zeppelin 1973_Houses_Of_The_Holy 1975_Physical_Graffiti 1976_Presence 1979_In_Through_The_Out_Door 1982_Coda 精确过滤结果 |
注 | 列出包含搜索内容的文件名。 用-l(或--files-with-matches)选项,就能够只列出这些行所在的文件(记住,-i选项用于让搜索不区分大小写)。 $ grep -il hideous h_p_lovecraft/* |
注 | 在搜索结果中进行搜索。 例如:所有在1966年到1967年之间发行的John Coltrane的专辑,而且在标题中没有包含Live。 $ ls -1 | grep 196[6-7] | grep -v Live 1967_Expression 1967_Stellar_Regions |
【find】
2017-02-10find -name注 | 根据文件名(或文件名的一部分)查找文件。 $ find . -name "*Shaggs*" ./Outsider/Shaggs ./Outsider/Shaggs/Gimme_Dat_Ting_(Live).mp3 用引号把通配符括起来,就找到文件夹和文件了。 |
注 | 通过拥有者来搜索文件。 $ find . -user scott 查找拥有者不是scott的文件,可能更容易,只要在想取反的选项前面加一个叹号(!)。 $ find . ! -user scott |
注 | 根据用户组搜索文件。 让我们来看看是否有文件不属于music组,如下所示: $ find . ! -group music |
注 | 根据文件大小搜索文件。 如果没有在数字后面附加字符,默认使用的大小单位就是512字节块(文件的字节数先除以512,再取整到最接近的一个整数)。 在*久唱不衰的专辑(如London Calling)中查找文件大小是10MB的歌曲。使用find命令完成这个搜索非常简单,如下所示: $ find . -size 10M 如果要搜索的文件大小大于10MB,需要在指定的大小前面加一个加号(+);如果要搜索的文件大小小于10MB,则需要在大小前面加一个减号(-),如下所示: $ find . -size +10M |
注 | 根据文件类型搜索文件。 f 普通文件 d 目录 l 符号(软)链接 b 块文件 c 字符文件 p FIFO(First In First Out)文件 s 套接字 使用-type d搜索文件夹: $ find Steely_Dan/ -type d 根据年份进行排序,以便得到更精确的信息,如下所示: $ find Steely_Dan/ -type d | sort 使用管道符(|)对find命令生成的列表进行过滤,效果非常好。 |
注 | 当表达式均为true时显示结果(AND)。 可以用-a(或-and)把任意多个选项串接在一起。 $ find . -name "Rolling_Stones*" -a -type f 1968_Beggars_Banquet/03_-_Dear_Doctor.mp3 1968_Beggars_Banquet/01_-_Sympathy_For_The_Devil.mp3 1968_Beggars_Banquet/02_-_No_Expectations.mp3 把find命令的结果通过管道传递给wc(代表word count),但还要使用-l选项,这样最终结果统计的是行数,而不是字数,如下所示: $ find . -name "Rolling_Stones*" -a -type f | wc -l 317 317首Rolling Stones乐队的歌曲。 |
注 | 当表达式中只有一个为true时就显示结果(OR) 如在当前目录找出大小超过10M或大小为10M的文件: $ find . -size +10M -o -size 10M 一是从结果中排除25周年纪念版的信息,二是确保OR语句运行正常。 要排除25周年纪念版的歌曲,在命令行的末尾增加!-name "*25*"。要确保OR语句运行正常,需要用括号把它括起来,对语句进行组合。不过,需要使用反斜杠(\)对括号进行转义,这样shell才不会误解它们,而且还需要在语句前后都留下空格。 $ find . \( -size +10M -o -size 10M \) ! -name "*25*" 从/media/music的根目录下运行命令,并使用-a选项(耐心点,一会就要使用-o了),如下所示: $ find . -name "*mp3*" -a -type f | wc-l |
注 | 当表达式为not true时显示结果(NOT)。 使用find命令确定在music盘中有多少个mp3、ogg和flac文件,但这个盘中总共有多少个文件呢? $ find . -name "*" | wc -l 52111 |
注 | 对搜索到的每个文件执行命令。 用{}符号来代表找到的每个文件,并用\对分号(;)进行转义以作为命令的结束,这样shell就不会把它理解为命令栈的标志。 和-exec选项一起使用的程序是rename,它可以修改文件名中的某些部分: $ find . -name " *MP3" -exec rename 's/MP3/mp3/g' {} \; rename命令后面是关于文件名如何变化的指令,其格式为:s/old/new/g[s代表substitute(替换),g代表global(全部)]。现在来看看命令能否起到作用: $ find . -name "Robert_Johnson*MP3" $ ls -1 Blues/Robert_Johnson/ Hellhound_On_My_Trail.mp3 Judgment_Day.mp3 Dust_My_Broom.mp3 搜索文件名包含空格和m3u结尾的文件,并将空格修改为下划线: $ find . -name "* *m3u" -exec rename 's/\ /_/g' {}\; $ find . -name "* *m3u" $ |
注 | 将搜索结果打印到文件。 $ find . ! \( -name "*mp*" -o -name "*ogg" -o -name →"*flac" -o -type d \) -fprint non_music_files.txt |
【history】
2017-02-10history注 | 这个文件只保存最新的500条命令行历史记录。要查看命令行历史列表,只需输入history命令。如下所示: $ history $ history | less 现在就能非常容易地逐一查看结果了。 |
注 | 再次运行最近运行过的命令,即最后一条命令。 $ pwd /home/scott $ !! pwd /home/scott |
注 | 使用数字再次运行以前运行过的命令。 $ pwd /home/scott $ whoami scott $ !499 pwd |
注 | 使用字符串再次运行以前运行过的命令。 $ cat /home/scott/todo Buy milk $ cd /home/scott/pictures $ !cat cat /home/scott/todo Buy milk |
【alias】
2017-02-10alias注 | 显示所有命令的别名。 $ alias alias la='ls -a' alias ll='ls -l' |
注 | 输入alias命令,可能很难找到特定的某个别名。如果想查看一下特定别名的命令内容,只需要在alias命令后面加上这个别名的名字就可以了。如下所示: $ alias wgetpage |
注 | 创建新的临时别名 $ alias lsd='ls -d */' $ lsd |
注 | 创建新的永久别名 别名的名称中不能包含等号(=)。在.bash_aliases中增加别名以后,保存文件并退出。但新增加的别名不能用。需要重新加载.bash_aliases |
注 | 删除别名。 $ lsd by_pool/libby_pix/on_floor/ $ unalias lsd $ lsd $ |
【ps aux】
2017-02-12ps aux注 | 查看当前正在运行的所有进程。 $ ps aux ps命令能提供很多信息,包括进程的拥有者、唯一的进程ID编号(PID,用于标识进程)、进程正在使用的CPU百分比(%CPU)和内存百分比(%MEM)、进程的当前状态(STAT)及进程的名称。 将ps aux的输出通过管道传递给grep,这是一种对特定命令的结果进行限制的简单方法。 $ ps aux | grep [f]irefox 现在知道了正在计算机上运行的Firefox实例,包括谁在运行这个程序、加载这个程序占用了计算机的多少资源,以及这个程序已经运行了多长时间。 |
注 | 查看进程树。 ps命令能够提供该进程树的一种基于文本的表现方式,这样就能可视化地看看该进程又创建了哪些其他进程。要查看进程树,除了使用上一节用过的a、u和x选项,还要加上个f(其名称源于ASCII art forest)选项。 $ ps axuf |
注 | 查看特定用户拥有的进程。 如果想把结果限制为某个用户拥有的进程,只需使用U选项,后面跟上用户名或ID编号就可以了。 $ ps U scott |
【kill】
2017-02-12kill注 | 终止正在运行的进程。 通常,应该先试试-15(其实,如果kill命令没有使用任何选项,它就是默认值)。 -9选项相当于强制中断一个正在运行的进程(即使这个进程还在处理它的作业),从而可能在系统中遗留下失去控制的临时文件或进程,所以这绝对不是个好想法。 $ kill -9 27921 |
【top】
2017-02-12top注 | 查看正在运行的进程的动态更新列表。 top命令提供的则是进程的动态更新的视图,展示系统中正在运行着什么进程,以及每个进程正在使用多少系统资源。 $ top top命令会自动根据%CPU列的数值对输出进行排序。 如果想在top命令中关闭程序,只需按k键。 PID to kill: 输入想关闭进程的PID(假设为8026),按Enter键,默认15信号。 按q键;退出top命令。 top命令非常有用,你将发现自己会经常使用这个命令找出Linux计算机中到底正在运行着什么进程。 |
【lsof】
2017-02-12lsof注 | 列出打开的文件。 要查看完整的打开文件列表,可以使用lsof命令(list open files的缩写)。 # lsof | less |
注 | 列出某个用户打开的文件。 在lsof命令中增加一个-u选项,后面跟上用户名(记住,lsof必须以在root用户来运行)。 # lsof -u scott |
注 | 列出正在使用特定文件的用户。 正在使用SSH守护进程(daemon),远程连接到这台计算机的用户会使用该进程(记住,必须以root用户来运行lsof)。 # lsof /usr/sbin/sshd |
注 | 列出特定程序的进程。 为了找出与正在运行中的特定程序关联的所有其他文件,可以在lsof命令后面加上-c选项,然后是正在运行的(也就是“打开”的)程序的名称。 # lsof -c sshd |
【free】
2017-02-12free注 | 显示系统RAM的信息。 要查看系统内存的当前状态,可以使用free命令。 $ free -b选项以字节为单位显示内存使用大小,而-m选项(可能是最常用的选项)则以兆字节为单位。 $ free -m |
【df】
2017-02-12df注 | 显示文件系统的磁盘使用情况。 运行df,就会列出系统中可以使用的磁盘空间,每个空间已经使用了多少,及它们各自挂载到文件系统的什么位置。 $ df 换用-h(或--human-readable)选项,结果通常会更容易理解。 $ df -h |
【du】
2017-02-12du注 | 报告目录使用的文件空间。 du命令(disk usage的缩写)能够解决这个问题。先用cd命令将当前工作目录切换到待查的目录,然后运行du命令。 $ cd music $ du 使用-h(或--human-readable)选项,以更易于理解的方式来查看结果。 $ cd music $ du -h 36M ./Donald_Fagen |
注 | 只报告目录使用的总空间。 使用-s选项,让du命令只报告占用空间的总量。 $ cd music $ du -hs 2.6G . 简洁明了。 |
【rpm】
2017-02-12rpm -ihv [package]rpm -Uhv [package]
注 | 为基于RPM的Linux系统安装软件。 rpm命令用于安装以.rpm为后缀的软件安装程序,这看起来完全符合逻辑。要安装RPM软件包,需要先下载。 下载nmap的RPM软件包,下载到系统以后,只需运行rpm命令,并提供3个选项:-i(安装软件包)、-h(安装过程中显示hash标记)和-v(显示命令的执行过程)。要运行rpm命令,还必须具有root权限,其基本格式如下所示: # rpm -ihv nmap-4.01-1.i386.rpm 不过,实际上这还不是你应该运行的命令。一个更好的选择是-Uhv,其中-U代表“update(升级)”。为什么-U比-i更好呢?因为选项-i只进行安装,而选项-U则进行升级和安装。 如果在名为software的子目录中有20个.rpm文件,只需要运行以下命令: # rpm -Uhv software/*.rpm |
注 | 删除基于RPM的Linux系统中的软件包。 # rpm -e nmap |
【yum】
2017-02-12yum install [package]注 | 为基于RPM的Linux系统安装软件包及其依赖程序。 yum命令是rpm的一个包装器,可以安装、升级和卸载软件包。 # yum install xmms |
注 | 删除基于RPM的Linux系统中的软件包及其依赖程序。 # yum remove xmms |
注 | 升级基于RPM的Linux系统中的软件包及其依赖程序。 # yum update |
yum list available
注 | 为基于RPM的Linux系统查找可供下载的软件包。 更好的办法就是先通过yum来查询可用的软件包(这通常会生成另一个疯狂增长的列表),接着再将结果通过管道发送给grep,让它继续搜索。 $ yum list available | grep gimp |
【dpkg】
2017-02-12dpkg -i [package]注 | 为Debian安装软件包。 # dpkg -i skype_1.2.0.18-1_i386.deb 在K/Ubuntu和其他支持sudo的发行版中应该按以下方式使用这个命令: $ sudo dpkg -i |
注 | 删除Debian中的软件包。 如果你厌倦了Skype,想把它从计算机中删除,这也是小事一桩。 # dpkg -r skype |
【apt-get】
2017-02-12apt-get install [package]注 | 为Debian安装软件包及其依赖程序。 |
注 | 删除Debian中的软件包及其依赖。 功能与apt-get install正好相反:卸载指定的软件包,以及相关的任何依赖程序。注意,这个命令要引用的是包名,而不是文件名,所以得运行apt-get remove sshfs,而不是apt-get remove sshfs_1.1-1_i386.deb。 # apt-get remove sshfs 如果你确实想要删除所有东西,则应该加上--purge选项,如下所示: # apt-get --purge remove sshfs |
注 | 升级Debian中的软件包及其依赖。 # apt-get update # apt-get upgrade 先运行apt-get update命令,以便让你的计算机和apt仓库保持同步。接着apt-get upgrade检查本机已经安装过的软件包与apt仓库可用的软件包是否有任何区别。如果存在区别,apt就会显示它将要下载和安装的软件包列表。 使用apt升级Linux系统最有效的方法是把这些命令连接起来使用: # apt-get update && apt-get upgrade &&可以确保只有apt-get update成功完成以后,才会运行apt-get upgrade。 |
注 | 为基于Debian的Linux系统查找可供下载的软件包。 可以搜索apt仓库中可用的软件包列表。这里有个不错的变化,使用apt-cache search不需要具有root权限。 $ apt-cache search dvdcss |
注 | 清除Debian中不再需要的安装包。 # apt-get clean 删除这些不需要的.deb文件,可以使用apt-get clean命令(注意,运行这个命令需要具有root权限) |
【ping】
2017-02-12pingping –c
注 | 验证计算机是否正在运行和能否接收请求。 ping命令能够向指定的IP地址发送一种特殊的数据包(ICMP ECHO_REQUEST消息)。 如果ping响应成功,则意味着两台计算机之间的网络是连通的。 $ ping www.google.com 如果想给ping加一些限制,仅发送一定数量的数据包,则可以使用-c选项,后面跟上一个数字。在ping发送的数据包个数达到指定的数量后,就会停止,并报告结果。 $ ping -c 3 www.granneman.com |
【traceroute】
2017-02-12traceroute注 | 跟踪数据包在两台主机之间经过的路由。 traceroute命令能够显示数据包从你的计算机路由到指定的主机上时经过的每一步。 $ traceroute www.granneman.com 应对有问题的tracerouter命令的另一种方法是增加命令尝试的最大跳数。在默认情况下,跳数的最大值是30。不过,可以使用–m选项来修改这一设置,例如traceroute -m 40 www.bbc.co.uk。 |
【host】
2017-02-12host注 | 执行DNS查询。 快速获得和某个域名关联的IP地址,可以使用host命令,如下所示: $ host www.granneman.com www.granneman.com is an alias for granneman.com. granneman.com has address 216.23.180.5 也可以做相反的操作,找出与某个IP地址关联的域名,如下所示: $ host 65.214.39.152 152.39.214.65.in-addr.arpa domain name pointer web.bloglines.com. |
【ifconfig】
2017-02-12ifconfig注 | 查看网络接口状态。 要快速查看系统的网络设备,以及它们是否正在运行,可以使用ifconfig(代表interface configuration,接口配置)命令和它的-a(代表all)选项。 $ ifconfig -a ath0(一个无线网卡) eth0(一个以太网卡) lo[环回(loopback)接口 |
注 | 要将eth0上的以太网卡的IP地址修改为192.168.0.125,可以运行以下命令(几乎所有与ifconfig相关的命令,都需要以root用户来运行): # ifconfig eth0 192.168.0.125 |
注 | 查看无线网络接口的状态。 尽可能多地得到与无线网卡相关的数据,应该用iwconfig代替ifconfig。 $ iwconfig |
注 | 使用DHCP获得新的网络地址。 # dhclient eth0 |
注 | 启动网络连接。 当ifup检测到网络事件(例如,机器重启、或插入网线)时,它就会开始运行,接着再执行网络配置文件中的指令。 # ifup eth0 |
注 | 关闭网络连接。 是因为你正在尝试启动某个网络连接,而且ifconfig也报告它已经打开,但发现其配置有问题。所以得先关闭这个网络连接,再打开它,如下所示: # ifup eth0 ifup: interface eth0 already configured # ifdown eth0 # ifup eth0 |
【route】
2017-02-12route注 | 显示IP路由表。 当通过浏览器访问www.ubuntu.com时,Linux系统是如何知道把请求发送到路由,而不是相邻的另一台计算机呢? 答案是:Linux内核通过路由表来保持跟踪这些信息。 $ route Flags(标志)列,该列提供关于路由本身的一些信息。标志有几种,但最常见的是U(表明路由已启动并可用)和G(表明路由使用网关)。 |
注 | 运行route命令,确认网关真的是找不着了,然后使用route命令把网关添加到路由表中。 add表示正在添加一个新的路由(要删除路由,则用del)。-net选项告诉内核,正在添加的目标是一个网络,在这个例子中是default目标。gw表示想使用位于192.168.0.1的网关对匹配目标(这里是default,因此使用子网掩码0.0.0.0)的数据包进行路由。最后,dev eth0指定要使用的设备,在这个例子中使用的是eth0上的以太网卡。 |
【ssh】
2017-02-12ssh注 | 安全登录到另一台计算机。 假设为了查看某个文件,现在想用ssh命令,把笔记本电脑(计算机名为pound,IP地址为192.168.0.15)连接到台式机上(计算机名为eliot,IP地址为192.168.0.25)。你在笔记本上的用户名是ezra,而台式机上的用户名是tom。为了SSH到eliot,需要输入以下命令[也可以使用域名(如果存在),例如hoohah.granneman.com]: $ ssh tom@192.168.0.25 |
注 | 不用密码安全登录到另一台计算机。 假设现在想从pound(用户名为ezra)登录到eliot(用户名为tom),而且不需要输入任何密码。首先,用以下命令在pound上创建一个ssh身份验证密钥(authentication key): $ ssh-keygen -t dsa 按Enter键,接受密钥要保存到的默认位置,密语(passphrase)为空,此时将提示按两次Enter键。这样就在~/.ssh/id_dsa文件中创建了一个私钥,在~/.ssh/id_dsa.pub文件中创建了一个公钥。 现在需要将公钥(不是私钥)从pound传送到eliot上。ssh开发人员走得比我们要远,他们已经创建了一个程序,让这一操作变得易如反掌。为了将公钥自动从pound复制到eliot,只需要在pound上输入以下命令: $ ssh-copy-id -i ~/.ssh/id_dsa.pub tom@192.168.0.25 现在试着用ssh'tom@192.168.0.25'登录eliot,再检查一下.ssh/authorized_keys,确保这次它没有在这个文件中额外添加你不想要的密钥。至此已经搞定了(如果你想试试ssh-copy-id命令给出的建议,尽管去试)。看看当使用ssh命令从pound连接到eliot时,会发生什么: $ ssh tom@192.168.0.25 |
注 | 在计算机之间安全地传输文件。 $ sftp tom@192.168.0.25 Connecting to 192.168.0.25... tom@192.168.0.25's password: sftp> 有用的SFTP命令 命令 含义 cd 切换目录 exit 关闭与远程SSH服务器的连接 get 将指定的文件复制到本机 help 获取与命令相关的帮助 lcd 将目录切换到本机 lls 列出本机上的文件 ls 列出远程SSH服务器上当前工作目录中的文件 put 将指定的文件复制到远程SSH服务器 rm 将指定的文件从远程SSH服务器删除 |
注 | 在主机之间安全复制文件。 $ scp user@host1:file1 user@host2:file2 假设你想使用scp命令把backup.sh从pound(IP地址为192.168. 0.15,用户名为ezra)复制到eliot(IP地址为192.168.0.25,用户名为tom)的/home/tom/bin目录,如下所示: $ pwd /home/ezra $ ls ~/bin backup.sh $ scp ~/bin/backup.sh tom@192.168.0.25/home/tom/bin backup.sh 100% 8806 8.6KB/s 00:00 $ |
【rsync】
2017-02-12rsync -v注 | 安全传输和备份文件 rsync -v rsync是最酷、最有用的命令之一,很多人每天都要依赖它(就像我一样)。 如果想真正保证数据的安全,应该在周期性的cron作业中设置rsync命令自动运行。例如,创建一个名为backup.sh的文件(~/bin是保存这个文件的好地方),在其中输入前面已经用过的命令,如下所示: $ rsync --verbose --progress –stats →--recursive --times --perms –links →--compress --rsh=ssh –delete →/home/sam/documents/ will@wordsworth: →/media/backup/documents 用chmod让这个文件成为可执行的:$ chmod 744 /home/scott/bin/backup.sh 接着将以下几行命令添加到一个名为cronfile的文件中(也可以将这个文件放在~/bin目录中): # backup documents every morning at 3:05 am 05 03 * * * /home/scott/bin/backup.sh 第一行是段注释,解释了这一定时任务的目的,第二行告诉cron在每天夜里的3:05 a.m自动运行/home/scott/bin/backup.sh。 现在把这个定时任务加到cron,如下所示:$ crontab /home/scott/bin/cronfile 现在再也不必为备份文件担心了。它是全自动执行的,只要确保计算机通宵开着就行! |
【wget】
2017-02-12wget注 | 非交互式地下载文件。 wget这个命令就是用于无干扰地下载多个文件和Web网站。 如何下载这些位于不同目录中的具有不同文件名称的所有MP3文件。答案就是wget。 先在计算机上创建一个目录,保存要下载的MP3文件。 $ mkdir radio_mp3s 使用cd命令,进入到新创建的那个目录,再运行wget,如下所示: $ cd radio_mp3s $ wget -r -l2 -np -w 5 -A.mp3 -R.html,.gif →http://www.oldtimeradioarchives.com/mp3/` wget的-r(或--recursive)选项会沿着链接,深入到各个子目录中搜索文件。通过告诉wget以递归方式进行下载,可以保证wget遍历每个season_#子目录,抓取回它找到的所有MP3文件。 -l2(或--level=[#])选项不但重要,而且也很微妙。它用于告诉wget在取回文件时最多应该递归多深。小写的字母l在这里代表“level(层)”,数字表示wget应该向下搜索的最大深度。 指定-l2,也就是让wget先进入/mp3(这是第一层目录),然后再依次进入每个season_#目录,抓取回子目录中的任何东西。 避免下载过多文件的一种办法是使用-np(或--no-parent)选项,它可以阻止wget递归到父目录。 w(或--wait=[#])选项可以在每两个文件的下载之间引入一个短暂的时间间隔。 -A(或--accept)用于告诉wget:你只想下载某种类型的文件,而其他文件则不需要下载。A代表accept(接受),后面跟着需要下载的各种文件的后缀名[用逗号(,)分隔]。 -R(或--reject)选项则是告诉wget不想下载的文件:HTML和GIF文件。 |
→http://www.neato.com/articles/index.htm
注 | 假设正在浏览www.neato.com这个网站,现在位于www.neato.com/articles/index.htm这个链接上。你想复制/articles目录下的所有东西,而且并不想要这个网站上的其他东西。以下命令就可以完成这个任务: $ wget -E -r -k -p -w 5 –np →http://www.neato.com/articles/index.htm |
【curl】
2017-02-12curl注 | 顺序下载多个文件和因特网资源。 $ curl -O http://www.wbez.org/ta/[1-10].rm [1/10]: http://www.wbez.org/ta/1.rm → 1.rm --_curl_--http://www.wbez.org/ta/1.rm 注意,上面这个命令是如何使用[1-10].rm来指定想要下载的1.rm、2.rm、3.rm等文件的。 |
多看笔记 来自多看阅读 for Android duokanbookid:f5d14a5c320d11e28a9300163e0123ac