让我们用这些unix/linux命令技巧开启新的一年,提高在终端下的生产力。我已经找了很久了,现在就与你们分享。

<a target="_blank"></a>
我在生产服务器上有一个很大的200gb的日志文件需要删除。我的rm和ls命令已经崩溃,我担心这是由于巨大的磁盘io造成的,要删除这个大文件,输入:
<code>> /path/to/file.log</code>
<code># 或使用如下格式</code>
<code>: > /path/to/file.log</code>
<code></code>
<code># 然后删除它</code>
<code>rm /path/to/file.log</code>
试试使用script命令行工具来为你的终端输出创建输出记录。
<code>script my.terminal.sessio</code>
输入命令:
<code>ls</code>
<code>date</code>
<code>sudo service foo stop</code>
要退出(结束script会话),输入 exit 或者 logout 或者按下 control-d。
<code>exit</code>
要浏览输入:
<code>more my.terminal.session</code>
<code>less my.terminal.session</code>
<code>cat my.terminal.session</code>
<code>mkdir /tmp</code>
<code>chmod 1777 /tmp</code>
<code>chown root:root /tmp</code>
<code>ls -ld /tmp</code>
为了我的数据隐私,我想要锁定我文件服务器下的/downloads文件夹。因此我运行了:
<code>chmod 0000 /downloads</code>
root用户仍旧可以访问,而ls和cd命令则不工作。要还原它用:
<code>chmod 0755 /downloads</code>
害怕root用户或者其他人偷窥你的个人文件么?尝试在vim中用密码保护,输入:
<code>vim +x filename</code>
或者,在退出vim之前使用:x 命令来加密你的文件,vim会提示你输入一个密码。
只要输入:
<code>reset</code>
传递-h或者-h(和其他选项)选项给gnu或者bsd工具来获取像ls、df、du等命令以易读的格式输出:
<code>ls -lh</code>
<code># 以易读的格式 (比如: 1k 234m 2g)</code>
<code>df -h</code>
<code>df -k</code>
<code># 以字节、kb、mb 或 gb 输出:</code>
<code>free -b</code>
<code>free -k</code>
<code>free -m</code>
<code>free -g</code>
<code># 以易读的格式输出 (比如 1k 234m 2g)</code>
<code>du -h</code>
<code># 以易读的格式显示文件系统权限</code>
<code>stat -c %a /boot</code>
<code># 比较易读的数字</code>
<code>sort -h -a file</code>
<code># 在linux上以易读的形式显示cpu信息</code>
<code>lscpu</code>
<code>lscpu -e</code>
<code>lscpu -e=cpu,node</code>
<code># 以易读的形式显示每个文件的大小</code>
<code>tree -h</code>
<code>tree -h /boot</code>
<code>## linux 版本 ##</code>
<code>lslogins</code>
<code>## bsd 版本 ##</code>
<code>logins</code>
示例输出:
<code>uid user pwd-lock pwd-deny last-login gecos</code>
<code>0 root 0 0 22:37:59 root</code>
<code>1 bin 0 1 bin</code>
<code>2 daemon 0 1 daemon</code>
<code>3 adm 0 1 adm</code>
<code>4 lp 0 1 lp</code>
<code>5 sync 0 1 sync</code>
<code>6 shutdown 0 1 2014-dec17 shutdown</code>
<code>7 halt 0 1 halt</code>
<code>8 mail 0 1 mail</code>
<code>10 uucp 0 1 uucp</code>
<code>11 operator 0 1 operator</code>
<code>12 games 0 1 games</code>
<code>13 gopher 0 1 gopher</code>
<code>14 ftp 0 1 ftp user</code>
<code>27 mysql 0 1 mysql server</code>
<code>38 ntp 0 1</code>
<code>48 apache 0 1 apache</code>
<code>68 haldaemon 0 1 hal daemon</code>
<code>69 vcsa 0 1 virtual console memory owner</code>
<code>72 tcpdump 0 1</code>
<code>74 sshd 0 1 privilege-separated ssh</code>
<code>81 dbus 0 1 system message bus</code>
<code>89 postfix 0 1</code>
<code>99 nobody 0 1 nobody</code>
<code>173 abrt 0 1</code>
<code>497 vnstat 0 1 vnstat user</code>
<code>498 nginx 0 1 nginx user</code>
<code>499 saslauth 0 1 "saslauthd user"</code>
我意外在/var/www/html/而不是/home/projects/www/current下解压了一个tarball。它搞乱了/var/www/html下的文件,你甚至不知道哪些是误解压出来的。最简单修复这个问题的方法是:
<code>cd /var/www/html/</code>
<code>/bin/rm -f "$(tar ztf /path/to/file.tar.gz)"</code>
正经地说,你应该试一下用htop代替top:
<code>sudo htop</code>
只需要输入!!。比如:
<code>/myhome/dir/script/name arg1 arg2</code>
<code># 要再次运行相同的命令</code>
<code>!!</code>
<code>## 以root用户运行最后运行的命令</code>
<code>sudo !!</code>
!!会运行最近使用的命令。要运行最近运行的以“foo”开头命令:
<code>!foo</code>
<code># 以root用户运行上一次以“service”开头的命令</code>
<code>sudo !service</code>
!$用于运行带上最后一个参数的命令:
<code># 编辑 nginx.conf</code>
<code>sudo vi /etc/nginx/nginx.conf</code>
<code># 测试 nginx.conf</code>
<code>/sbin/nginx -t -c /etc/nginx/nginx.conf</code>
<code># 测试完 "/sbin/nginx -t -c /etc/nginx/nginx.conf"你可以用vi再次编辑这个文件了</code>
<code>sudo vi !$</code>
如果你需要提醒离开你的终端,输入下面的命令:
<code>leave +hhmm</code>
这里:
hhmm - 时间是以hhmm的形式,hh表示小时(12时制或者24小时制),mm代表分钟。所有的时间都转化成12时制,并且假定发生在接下来的12小时。
想要进入刚才进入的地方?运行:
<code>cd -</code>
需要快速地回到你的家目录?输入:
<code>cd</code>
变量cdpath定义了目录的搜索路径:
<code>export cdpath=/var/www:/nas10</code>
现在,不用输入cd */var/www/html/ 这样长了,我可以直接输入下面的命令进入 /var/www/html:
<code>cd html</code>
要编辑一个正在用less浏览的文件,可以按下v。你就可以用变量$editor所指定的编辑器来编辑了:
<code>less *.c</code>
<code>less foo.html</code>
<code>## 按下v键来编辑文件 ##</code>
<code>## 退出编辑器后,你可以继续用less浏览了 ##</code>
要看到你系统中的所有目录,运行:
<code>find / -type d | less</code>
<code># 列出$home 所有目录</code>
<code>find $home -type d -ls | less</code>
要看到所有的文件,运行:
<code>find / -type f | less</code>
<code># 列出 $home 中所有的文件</code>
<code>find $home -type f -ls | less</code>
你可以用mkdir加上-p选项一次创建一颗目录树:
<code>mkdir -p /jail/{dev,bin,sbin,etc,usr,lib,lib64}</code>
<code>ls -l /jail/</code>
不必运行:
<code>cp /path/to/file /usr/dir1</code>
<code>cp /path/to/file /var/dir2</code>
<code>cp /path/to/file /nas/dir3</code>
运行下面的命令来复制文件到多个目录中:
<code>echo /usr/dir1 /var/dir2 /nas/dir3 | xargs -n 1 cp -v /path/to/file</code>
diff命令会按行比较文件。但是它也可以比较两个目录:
<code>ls -l /tmp/r</code>
<code>ls -l /tmp/s</code>
<code># 使用 diff 比较两个文件夹</code>
<code>diff /tmp/r/ /tmp/s/</code>
图片: 找出目录之间的不同
你可以用fmt命令重新格式化每个段落。在本例中,我要用分割超长的行并且填充短行:
<code>fmt file.txt</code>
你也可以分割长的行,但是不重新填充,也就是说分割长行,但是不填充短行:
<code>fmt -s file.txt</code>
如下使用tee命令在屏幕上看见输出并同样写入到日志文件my.log中:
<code>mycoolapp arg1 arg2 input.file | tee my.log</code>
tee可以保证你同时在屏幕上看到mycoolapp的输出并写入文件 my.log。
----------------------------------------------------------------------------------------------------------------------------