Linux常用技巧
1、Terminal美化
原生的 Terminal 上的一些设置可能不好用,可以自己添加一些配置,使得操作更加顺手。个人配置文件一般是在 $HOME 下(输入 cd 直接敲回车),有些系统的配置文件用的是 .cshrc 文件,有些系统是 .bashrc 文件,二者功能差不多,但是设置略微不同。修改好这个配置文件后,执行 soucer ~/.cshrc,或者新开一个 terminal,配置便会生效。
1.1 路径彩色显示
打开Linux的Terminal终端后,默认的路径显示里可能包含了“hostname”、“username”、“path”、“command”等,且都是一个颜色,难以区分。我们可以在HOME路径下的隐藏文件.cshrc或.bashrc里添加代码,实现路径的颜色显示,并只显示我们想看到的设置名,例如我习惯只保留“hostname”、“path”、“command”。
颜色参考可以查阅文章:shell bash终端中输出的颜色和格式详解(超详细)
# 用于.cahsrc文件,显示完整home路径
set prompt = "%{\e[32m%}\[`hostname`\] %{\e[93m%}%//%{\e[0m%} "
# 用于.cahsrc文件,home路径显示为~
set prompt = "%{\e[32m%}\[`hostname`\] %{\e[93m%}%~/%{\e[0m%} "
# 用于.bashrc文件,显示完整home路径
export PS1='\[\e[1;32m\][\u] \[\e[1;31m\]`pwd`/ \[\e[0m\]'
# 用于.bashrc文件,home路径显示为~
export PS1='\[\e[1;32m\][\u] \[\e[1;31m\]\w/ \[\e[0m\]'
效果如下所示:
这里还有一个技巧,如果想在 Terminal 页面上方显示当前的目录,可以在 set prompt 的最前面加入代码 "%{\e]0;%c\007%}",如下所示:
set prompt = "%{\e]0;%c\007%}%{\e[32m%}\[`hostname`\] %{\e[93m%}%//%{\e[0m%} "
这里的 %c 表示只显示最后一级目录,%c2 则是显示最后两级目录,%/ 是显示完整目录,%~也是显示完整目录,但是home路径显示为~。
1.2 cd后立刻ll
cd到某个目录后,除非特别熟悉,否则都会习惯输入 ls 或 ll 来查看目录下有哪些文件。那么可以设置一下,cd 后立刻会自动执行 ll,这样更加方便些。
# 用于.cshrc文件
alias cd "cd \!*;ll"
# 用于.bashrc文件
cd() { builtin cd "$@" && ll; }
1.3 tab列出文件
tab 列出文件即输入 cd 后,按 tab 键可以自动列出与已经输入的部分命令匹配的文件列表。
如果配置信息用的是 .cshrc 文件,添加如下代码,然后执行 source ~/.cshrc,或者新开一个 terminal 也会生效。
# 用于.cshrc文件
set autolist
如果配置信息用的是 .bashrc 文件,这种情况一般都自带 autolist 功能,那么可能还需要美化一下。新建一个 .inputrc 文件,然后添加如下代码,新开一个 terminal 会生效。
# 用于.inputrc文件:按tab键一次,即可显示文件列表
set show-all-if-ambiguous on
# 用于.inputrc文件:按tab键出现的文件列表里不显示隐藏文件
set match-hidden-files off
1.4 忽略大小写
输入 command 时,尤其是 cd 到某个目录,目录名称有大写小写字母,不太好按,可以设置忽略大小写,按 tab 键时会自动纠正,非常方便。
如果配置信息用的是 .cshrc 文件,添加如下代码,然后执行 source ~/.cshrc,或者新开一个 terminal 也会生效。
# 用于.cshrc文件
set complete = igncase
如果配置信息用的是 .bashrc 文件,新建一个 .inputrc 文件,添加如下代码,新开一个 terminal 会生效。
# 用于.inputrc文件:忽略大小写
set completion-ignore-case on
1.5 常用alias
有些自带的 Linux 命令不太方便,可以在 .cshrc 或 .bashrc 文件中添加 alias 命令,将命令改写,使得操作更加简便。
(1)新建alias文件
我们习惯专门建一个 .alias 文件来存放这些改写命令的设置,建立了 .alias 后,建议 .cshrc 文件中添加如下代码:
# 用于.cshrc文件
if (-r $HOME/.alias) then
source $HOME/.alias
endif
# 用于.bashrc文件
if [-f $HOME/.alias]; then
source $HOME/.alias
fi
这样我们执行 source ~/.cshrc 或 source ~/.bashrc 时,就能顺带 source .alias 文件了。
(2).cshrc 和 .bashrc 区别
alias 在 .cshrc 和 .alias 的语法有些不同,区别如下所示:
# .cshrc文件或其绑定的.alias文件
alias g gvim
alias g 'gvim'
alias g "gvim"
# .bashrc文件或其绑定的.alias文件
# 等号前后不能有空格
alias g='gvim'
alias g="gvim"
(3)常用alias
下面是几个常用的 alias,例如 ll 时,会以阿拉伯数字显示时间;rm、mv、cp时,会显示执行过程,可以判断系统是否卡死;tree时,树状图有颜色区分等。
alias g="gvim"
alias gt="gvim -p --remote-tab-silent"
alias la="ls -a"
alias ll="ls -lh --time-style=long-iso"
alias lla="ll -a"
alias .="cd ./"
alias ..="cd ../"
alias rm="del"
del()
{
\mv -f $@ ~/.Trash
}
alias mv="mv -i -v"
alias cp="cp -rf -v"
alias md="mkdir"
alias h="history"
alias ps="ps -Af"
alias df="df -k"
alias dusum="du -h -s"
alias duall="du -h --max-depth=1 --total"
alias cl="clear"
alias so="source ~/.bashrc"
alias grep="grep -n --color"
alias tree="tree -A -C"
alias gui="nautilus ."
2、Linux常用快捷键
下面是 Linux 的常用快捷键,不全,但是常用。
- A + B 表示一起 A 键和 B 键一起按。
- A - B 表示先按 A 键,再按 B 键。
快捷键 | 含义 |
Tab | 命令补全 |
鼠标选中 | 复制 |
鼠标中键 | 粘贴 |
Alt + Tab | 切换显示图形界面 |
Ctrl + l | 清屏,等价于输入命令 clear |
Shift + Ctrl + t | 新建标签页 |
Shift + Ctrl + w | 关闭标签页 |
Shift + Ctrl + q | 关闭终端 |
Shift + Ctrl + c | 终端上复制 |
Shift + Ctrl + v | 终端上粘贴 |
Esc - Backspace (Esc - d 或 Alt + d) | 向左(右)删除字符,直到碰到 _ 或 / |
Ctrl + w | 向左删除字符,直到碰到空格 |
Ctrl + u (Ctrl + k) | 向左(右)删除所有字符 |
Ctrl + a (Ctrl + e) | 光标跳到行首(尾) |
Alt + f (Alt + b) | 光标向左(右)跳一个单词 |
Ctrl + r | 搜索历史命令,按 Enter 执行 |
Ctrl + g | 退出搜索历史命令 |
Ctrl + s | 阻止屏幕输出 |
Ctrl + q | 允许屏幕输出 |
Ctrl + c | 终止命令 |
Ctrl + z | 挂起命令 |
f - g | 恢复挂起的命令 |
3、Linux常用命令
Linux 中有非常多的操作命令,这里仅记录自己常用的一些命令。
3.1 命令用法查询
有时候一些命令不记得具体用法或参数了,可以用下面几种方法查询用法。
(1)网络搜索
- 百度搜索用法,查看网上文章的介绍。
- 推荐去菜鸟网查看:Linux 命令大全 | 菜鸟教程
(2)help
Linux 命令分为内建命令和外部命令,内建命令的查询语法是“help 命令”、外部命令的查询语法是“命令 --help”,如果弄反会报错,再换一种语法就行。
# 内建命令
help cd
# 外部命令,-h或--h有时也行
cat --help
(3)man
help 显示的是命令的主要信息,如果需要更详细的内容,可以用命令“man 命令”,屏幕会显示系统存在的帮助手册内容,包含命令帮助、配置文件帮助和编程帮助等,按 q 键可以退出显示。
man cd
man cat
man 命令打印的信息都在 terminal 上,不方便查看,可以用“|tee”将其打印到指定文本,方便查看。
man cat |tee man_cd.log
(4)info
info 命令和 man 命令类似,用法是“info 命令”,二者内容差不多。man 页面里只有一级标题,而 info 页面存在多级标题,阅读体验不一样,按 q 键可以退出显示。
info ls
3.2 变量查询
(1)which
which 命令会在环境变量 $PATH 设置(或 alias)的目录里,查找符合条件的文件,列出其原文件目录。
(2)echo
echo 命令可以用于字符串的输出,也可以用于查询指令和环境变量。
另外:env 命令可以查询所有系统全局变量,set 命令可以查询所有系统全局变量、当前局部变量、用户自定义变量。
(3)who类
who 类命令可以查询用户相关信息。
- rwho:查询局域网里所有主机的用户。
- -a:查看所有用户,包括闲置时间超过1个小时的用户。
- who -H:查询系统中所有的使用者。
- w:查看哪些用户登陆在线,同时显示用户当前的进程。
- whoami:查询当前使用的账户名。
- whois:查询指定账户的用户相关信息。
(4)version
version 命令可以查询命令或工具的版本信息,语法是“命令 --version”或“命令 -V”。
(5)module
module是一个专门管理环境变量的工具,全程是module environment,一般应用于软件或运行库等设备有多个版本,且多个版本都需要在不同的场景或人员使用时。
- module av/ave/ava/avail:查看所有安装的工具
- module av tool/python:查看所有 python 版本
- module av license:查看所有安装工具的 license
- module show/display:查看安装工具的的相关信息
- module show xxx:查看 xxx 工具的相关环境变量
- module show license/xxx:查看 xxx 工具的 license 安装信息
- module load/add:加载指定版本的工具(卸载则为 unload/rm )
- module list:查看已经加载的工具(取消所有加载则为 purge)
- module switch a b:卸载工具a,加载工具b。
(6)lmstat
Flexlm 是常用的 license 管理工具,可以管理浮动 license,常用命令是:lmstat -a -c port@sever,port 是端口号,sever 是所在服务器。查询方法如下所示:
#获得xxx厂家license的port@server
module show license/xxx
#查询具体port@server的使用情况
lmstat -a -c port@server
注意:
- module show 查询结果可能有多个 port@server,中间用冒号“ : ”隔开,可以一起复制下来查,方便省事。
- 查询结果先 |tee 到一个文本中,再执行“sort ~/check.log | grep start”,结果就清爽多了。
- lmstat -a -c 查询结果会显示该厂家的所有工具的所有 license 使用情况,一个工具也可能因所购功能不同而有多个不同 license。
- 查询结果太多,可以用 -f 选项指定某 license 查询,则只会显示该 license 的使用情况。
- 可能安装有多家公司的 lmstat 工具(Cadance、Synopsis、Mentor 等),lmstat 命令是通用的,挑一个用就行。
3.3 管理员权限
- su [User]:Switch user,用于切换用户,输入后需要输入密码。
- su:省略后面 [User] ,表示切换到管理员身份。
- su [User]:切换用户,只能获得用户的执行权限,不能获得环境变量。
- su -[User]:切换用户,同时获得该用户的环境变量及执行权限。
- exit:命令可以退出管理员身份。
- sudo:能够以系统管理员的身份执行后面跟着的命令,输入后需要再输入密码。
3.4 后台运行&
输入命令启动 EDA 工具时,希望该工具后台运行,不占用当前的 Terminal,可以在命令后加入符号 &,有没有空格都可以。
verdi &
verdi&
3.5 安装工具
Linux 常用的版本分为很多类,常用的有 RedHat 系列和 Debian系列,二者的安装工具、安装包格式都不同,如下所示。注意安装工具命令都需要 sudo 命令放在前面。
- RedHat系列:Redhat、Centos、Fedora 等。
- 联网安装:yum命令,自动处理依赖性关系。
- 本地安装:rpm命令,包后缀是 .rpm,无法自动处理依赖性关系。
- Debian系列:Debian、Ubuntu 等。
- 联网安装:apt或apt-get命令,自动处理依赖性关系。apt是apt-get子集,更好用些。
- 本地安装:dpkg命令,包后缀是 .deb,无法自动处理依赖性关系。
它们都支持tar包,tar包可以在自己环境下编译,具有通用性,常用于开源工具。
#==================================== [CentOS] yum
安装:yum [-y] install <package>
卸载:yum remove <package>
更新:yum update <package>
搜索:yum search <package>
清理:yum clean
列出:yum list <package> #列出所有
yum list updates #列出可更新
yum list installed #列出已安装
#==================================== [CentOS] rpm
安装:rpm -ivh <package.rpm>
移除:rpm -e <package>
更新:rpm -Uvh <package>
查询:rpm -qa | grep <package>
#==================================== [Ubuntu] apt
安装:apt [-y] install <package>
卸载:apt remove <package>
更新:apt update <package>
搜索:yum search <package>
清理:apt clean
列出:apt list <package> #列出所有
apt list updates #列出可更新
apt list installed #列出已安装
#==================================== [Ubuntu] dpkg
安装:dpkg -i <package.deb>
卸载:dpkg -r <package> #保留配置
卸载:dpkg -P <package> #不留配置
很多时候我们需要先下载文件再安装,先安装 wget 工具,它支持断点下载功能,同时支持 FTP、HTTP、HTTPS 下载方式。
- wget [-b] url
- -b:可选的后台下载,会将日志写入到wget-log文件
- url:下载链接
- ctrl+c:停止下载
- tail -f wget-log,监控后台下载进度
wget http://xxxxxx.tar.gz
3.6 命令重定向
(1)|、|xargs
Linux 有一个很神奇的符号叫做管道符 |,即编程时敲的”或“符号,它的作用是放在命令之间,前一个命令的标准输出信息会作为后一个命令的标准输入信息,例如查看程序的进程情况,然后挑选出 verdi 进程:
ps -ef | grep verdi
但是它经常不能如我们所愿,因为有些命令希望管道传递过来的是给下一个命令用的参数,但是直接使用管道符有时无法传递到命令的参数位。这时候就需要增强型的命令 |xargs。
命令”|xargs“可以实现很多有用的功能,例如我想先用 find 命令查找到所需文件,然后在这些文件里用 grep 查找所需字符在哪里。
(2)>、>>和|tee
> 、>> 和 |tee 都能将上一命令输出的内容打印到指定文本上,使用方法如下所示:
命令 > 文本
命令 >> 文本
命令 |tee 文本
他们的区别在于:
- > :屏幕上不再显示上一命令输出的内容,打印结果覆盖文本原有的内容,该文本不能够已存在,否则报错。
- >>:屏幕上不再显示上一命令输出的内容,打印结果追加到文本原有的内容后面。
- |tee:屏幕上仍会显示上一命令输出的内容,打印结果覆盖文本原有的内容。
- |tee -a:屏幕上仍会显示上一命令输出的内容,打印结果追加到文本原有的内容后面。
鉴于他们的不同,我们需要在不同的使用场景合理选择,例如 makefile 中生成 filelist 文件时往往采用 > 或 |tee -a,而在 vcs 编译选项时,往往在最后加上 |tee vcs.log。
all: clean filelist com verdi
#---------------------------------------------------------------
filelist:
find ../de ../dv -name "*.v" -o -name "*.sv" > filelist.f
#---------------------------------------------------------------
com:
vcs -f filelist.f \
-timescale=1ns/1ps \
-full64 +v2k -sverilog -Mupdate \
+define+ARM_UD_MODEL \
-debug_acc+all -debug_region+cell+encrypt \
-R +vcs+finish+100000ns \
|tee vcs.log
#---------------------------------------------------------------
verdi:
verdi -f filelist.f -ssf tb_top.fsdb -play verdi.tcl &
#---------------------------------------------------------------
clean:
rm -rf csrc novas* *.log simv* *.fsdb ucli.key verdiLog *.rc
3.7 查找命令
(1)find
find 命令用于查找指定的文件,会在屏幕上打印出匹配文件的路径。语法:find [path] 参数。
- [path]:指定路径。
- 省略则表示指定为当前路径。
- 路径是类似 "."或 "..",则显示相对路径。
- -mtime:时间有关的选项。
- -mtime +7 :7天前被更动过内容的文件;
- -mtime -7:7天内被更动过内容的文件;
- -name:
- -name "文件名”:查找指定 path 及其子目录下的所有指定文件,支持 * 和 ? 进行模糊匹配。
- -iname "文件名":不区分大小写。
- ! -name "文件名”:排除掉某文件名
- -maxdepth:指定查询的目录深度,必须放在 path 后的第一个参数位。
- -exec:额外的动作
- find . -name "*.rc" -exec ls {} \;
- -exec 开头,\; 结尾,{}代替前面查找到的内容。
- 运算符:
- 与 -and:expr1 -and expr2,两个都要符合,很少用。
- 或 -or:-name "*.v" -or -name "*.sv"来生成 filelist。
- 非 -not:-not -name "文件名”:排除掉某文件。
(2)grep
grep 命令用于查找文件里的字符,会在屏幕上打印出匹配字符的那行文本。语法:grep 字符 [path]。
- [path]:指定路径,加了-r后可以省略,省略则表示指定为当前路径。
- -r:递归查找指定path及其子目录下的所有文件。
- -i:不区分大小写。
- -n:打印出匹配行的行号。
- -l:只打印匹配的文件名。
- -v:反向查找,只打印不匹配的行。
- -E "字符a|字符b":查找字符a或字符b,符号 | 前后不能有空格。
我想先用 find 命令查找到所需文件,然后在这些文件里查找所需字符在哪里,那么 find 命令和 grep 命令结合可以达到效果。方法是采用命令”|xargs“,解释见上文说明。
(3)wc
wc 命令用于统计文件的行数、单词数、字节数、字符数等。语法:wc [参数] path
- -l:行数
- -c:字节数
- -m:字符数
- -w:单词数
# 统计test.txt文件中带有 xxx 字符的关键字有多少行?
cat test.txt | grep xxx | wc -l
# 统计 test.txt文件中有多少个 xxx 字符?
cat test.txt | grep xxx | wc -w
3.8 修改权限
有时需要修改一个文件为可执行的权限,或者该文件希望共享给他人读写,可以使用命令 chmod。我们输入 ll 时,得到下图结果:
这些 rw 什么的就代表了这个文件的权限,含义如下所示:
按这张图,我的这些文件的权限都是 664,我希望将 makefile 文件修改为:我自己有全部权限,同组人员可读可执行但不能改写,其他用户无任何权限,那么可以执行命令 chmod 750 makefile:
如果只希望添加某种权限,例如把某个文件变成可执行的,可以直接+x,例如“chmod +x run.sh"
如果希望某个文件夹及其子文件都一次性改写权限,可以加上参数 -R。
3.9 比较命令
- vimdiff A B
- vim中的比较命令,颜色不好,比较也慢。
- gvimdiff A B
- gvim中的比较命令,颜色不好,比较也慢。
- meld A B
- 第三方比较工具,仅用于文件夹比较。
- bcompare A B
- 第三方比较工具,非常好用。
- 如果跳出 license 提示,可以删除 ~/.config/bompare/registry.dat文件。
3.10 进程命令
(1)显示进程
- jobs:查看当前会话中的后台任务。它只能显示当前终端中的后台进程,即与当前会话关联的进程。
- -l:列出进程ID。(推荐)
- -n:仅列出状态发生变化的任务。
- -r:仅列出正在运行的任务。
- -s:仅列出正在挂起的任务。
- bjobs:查看服务器上的进程。
- 参数同 jobs 类似。
- ps:查看当前系统的进程状态。与jobs命令不同,ps可以显示所有用户的进程信息,而不仅仅是当前会话。
- -a:显示所有进程,包括其他用户的进程和无终端进程。
- -u:以用户为基础显示进程,包括用户、进程号、CPU 占用、内存占用等信息。
- -x:显示无控制终端的进程,如守护进程等。
- -e:显示所有进程,类似-a。
- -f:显示进程的详细信息。
- 组合1:ps -aux | grep my_script.sh: 显示指定进程。(显示子进程PID)
- 组合2:ps -ef | grep my_script.sh:显示指定进程及其父子进程之间的关系。(显示子进程PID和父进程PPID)
- top:提供了一个实时动态的进程监视器。它可以查看系统中所有进程的实时状态,并根据资源占用对进程进行排序。在top界面中,你可以看到进程ID、用户、CPU占用、内存占用等信息。
- -u:显示指定用户名的进程。
- -p:显示指定进程ID的进程。
- -H:显示进程的详细信息。
(2)杀死进程
- kill:后面接jobs/ps查询到的pid,用于杀死指定进程。
- -9:强制终止进程。
- bkill:结束服务器上的进程
- -9:强制终止进程。
- xkill:杀死图像程序应用,鼠标点哪个杀哪个。
(3)进程占用
- lsof:List Open File的缩写,用来获取被进程打开文件的信息。
- -c:列出某个程序打开的文件。
- +d:列出指定目录被占用的程序。再用 kill -9 杀死进程
- -p:列出指定进程占用的所有文件
- -t:结果只列出PID,其他列忽略。
- -u:指定用户,查看用户已经打开的文件。
- kill -9 'lsof -t -u username':杀死指定用户所有进程。
3.11 磁盘命令
- du -h
- du 即 disk usage,查询当前目录下的文件存储情况,并将其写入到du.log文件中。
- du -h --max-depth=1 > ~/du_result.log:查询单曲目录下1层深度的文件存储情况,写到指定文件中。
- df -h
- ds 即 disk free,查询磁盘剩余容量。
- free -h
- 查询磁盘容量。
3.12 解压和打包
(1)tar命令
# 打包文件(tar默认只打包不压缩)
tar -cvf test.tar ./test # 得到test.tar备份文件
# 参数-z:打包后进行gzip压缩
tar -zcvf test.tar.gz ./test # 得到test.tar.gz备份文件
# 参数-j:打包后进行bzip2压缩
tar -jcvf test.tar.bz2 ./test # 得到test.tar.bz2备份文件
# 删除打包文件中的指定文件
tar -vf test.tar --delete ./a.txt
# 查看打包文件中的文件
tar -tvf test.tar # 列出文件,包括文件信息
注意:有时候会遇到 .tar.gz 和 .tgz 后缀,他们都是指 gzip 压缩,.tgz 是 .tar.gz 的简写。
(2)zip命令
# 压缩文件,参数-r表示递归
zip -r test.zip ./test
# 解压文件,参数-d指定目录,可省略
unzip -d ~/zip_test/ test.zip
# 删除压缩包中的指定文件
zip -d test.zip a.txt
# 添加新文件到压缩包中
zip -m test.zip ./a.txt
# 查看压缩包中的文件信息
zipinfo test.zip
3.13 软链接
- ln -s 源链接b 软链接a
- 为源链接 b 创建一个软链接 a
- -s:软链接,不加-s则创建的是“硬链接”,硬链接几乎不使用,和复制效果差不多。
- -f:强制链接,用于替换软链接目标,例如
ln -sf 新的源链接a 软链接b
- cp -d 软链接a b
- 复制软链接a为软链接b
- rm -rf 软链接a
- 删除软链接a,但不删除源链接的文件
- rm -rf 软链接a/
- 删除软链接a及其链接的文件
- 千万注意!千万注意!千万注意!不要因为多了个 / ,不小心将源文件删除了!!!
3.14 第三方查看命令
如果忘记了用什么命令打开文件,可以试试这两种方法。
- nautilus .:调出文件管理器,然后像 Windows 一样鼠标双击,会以默认程序打开该文件。
- xdg-open:Linux自动用默认程序打开该文件。
(1)默认程序xdg-open
用默认程序打开 xxx.pdf:
xdg-open xxx.pdf
查询 xxx.pdf 的文件类型是什么:
$ file -i test.pdf
test.pdf: application/pdf; charset=binary
查询默认打开该文件的默认程序是什么:
$ xdg-mime query default application/pdf
evince.desktop
设置 pdf 文件的默认打开程序为 wps:
$ xdg-mime default /usr/share/applications/wps-office-pdf.desktop application/pdf
(2)打开 Word
- openoffice.org
(3)打开 Excl
- soffice
- soffice3
- libreoffice
- openoffice.org
(4)打开 PDF
- acroread
- evince
- firefox(推荐)
(5)打开图片
- display
- eog
3.15 其他常用命令
- tree:树状图查看目录结构。
- -L:目录深度。
- -C:文件夹和文件标以不同颜色。
- -A:以ASCII码显示,样子好看些。
- cat:直接在Terminal上显示指定文件的内容。
- -n:指定显示的行数
- rename a b *.v:文件a重命名为b,范围是所有 *.v 文件。
- 如果本来就存在文件b,则文件b内容会被覆盖。
- tail:查看文件尾部内容,跟踪文件的最新更改。
- -f:持续跟踪(ctrl+c停止)。
- -num:查看尾部多少行,如-7(不填则默认10行)。
4 rm改到垃圾桶
大公司的 Linux 系统往往用特殊存储资源,自动保存文件,例如在任意目录下,输入”cd .snapshot“,会进入到一个隐藏文件夹,里面是1小时前、6小时前、24小时前、3天前、7天前的文件。这对我们用户非常友好,再也不怕误删了,也能轻易找到几天前丢弃的文件。但是很多小公司的存储资源有限,并没有做这样的功能,那 rm 误删了可就难受了。虽然完整的 snapshot 功能难以自己实现,但是 rm 命令重定向一下,改成丢向垃圾桶,这样还是很方便的,就和我们 Windows 一样了,有了一个后悔药。
4.1 自定义Trash
网上大多数文章描述的就是这种方法。
(1)bashrc
bash 环境下,在 home 目录下新建一个垃圾桶:”md ~/.Trash“,叫什么名字无所谓,是不是隐藏文件也无所谓,建立成隐藏文件只是为了不轻易看见。然后打开 .bashrc 文件,将 rm 命令重定向一下:
alias rm="del"
del()
{
\mv -f -v $@ ~/.Trash
}
然后 source 一下 .bashrc 文件,或者重开一个 Terminal,则会生效。
(2)cshrc
cshrc 环境下,在 home 目录下新建一个垃圾桶:”md ~/.Trash“,叫什么名字无所谓,是不是隐藏文件也无所谓,建立成隐藏文件只是为了不轻易看见。然后打开 .cshrc 文件,将 rm 命令重定向一下。这里之所以不用 \mv -f -v 命令,是因为在 cshrc 中, -f 命令似乎失效了,如果 .Trash 中有同名文件,加了 -f 选项也还是会报错说“mv: cannot move: File exists",无奈只好迂回一下,将文件复制到 .Trash 中(同名则覆盖),再将该文件删除,从而达到了 mv 的效果。
alias rm "\cp -rf \!* ~/.Trash; \rm -rf -v \!*"
然后 source 一下 .cshrc 文件,或者重开一个 Terminal,则会生效。
注意:上面的 mv 都是采用 \mv,作用是引用 Linux 原生态的 /usr/bin/mv 指令,因此就算下面 alias mv 成了别的指令,也不影响这里的 alias 效果。
(3)TrashClear.sh
可以在 .Trash 中新建一个 TrashClear.sh,编写内容为:
find . -mtime +7 -not -name "TrashClear.sh" -exec \rm -rf -v {} \;
然后将 TrashClear.sh 文件添加可执行权限,以后每周一或者任意时候,可以执行该文件,它会找到并删除垃圾箱里 7 天以前的文件,但是不会删除自己。
4.2 系统自带Trash
Linux 系统自带一个 Trash,和 Windows 很像,一般放在桌面,我们可以将文件丢进里面,如下所示:
Trash 的位置实际是 ~/.local/share/Trash,里面有 files 和 info 两个文件夹,分别是丢弃的文件以及该文件的丢弃信息。可是如果我们只是简单的将文件移动到这个 Trash/files 中,Trash/info 里也不会有文件的丢弃信息。如果希望出现该信息,那么需要用到指令“gio trash”,例如 gio trash a 就是将 a 丢到 Trash/files 中,同时生成丢弃信息到 Trash/info 中,如果 Trash/files 里有同名文件 a,则后丢弃的文件会自动明明为 a.2,因此不会覆盖。此外,gio trash 不区分文件和文件夹,因此不需要加入 -r -rf 等参数。
(1)alias
知道原理后,我们只需要将 rm 指令 alias 成 gio trash 就行啦,如下所示:
alias rm "gio trash"
(2)TrashClear.sh
可以在 Trash 下新建一个 TrashClear.sh,编写内容为:
find . -mtime +7 -not -name "TrashClear.sh" -exec \rm -rf -v {} \;
然后将 TrashClear.sh 文件添加可执行权限,以后每周一或者任意时候,可以执行该文件,它会找到并删除垃圾箱里 7 天以前的文件,但是不会删除自己。就算删除了 Trash/files 和 Trash/info 也没有关系,下次只要执行了 gio trash,这两个文件夹就又恢复了。
当然,也可以直接在桌面系统中打开 Trash 图标,直接清空垃圾桶。
4.3 crontab
大公司 Linux 下的 .snapshot 只会保存近期内(如 7 天)的文件,更远日期的会自动删除,我们也可以用 Linux 自带的 crontab 功能实现自动删除的功能,这样 .Trash 越来越大时,就不需要经常手动去清空了。
(1)crontab功能
Linux crontab 是 Linux 系统中用于设置周期性被执行的指令的命令。Linux 任务调度的工作主要分为以下两类:
- 1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
- 2、个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
语法如下:
crontab [ -u user ] { -l | -r | -e }
含义如下:
#查看当前用户的 crontab 文件:
crontab -l
#编辑当前用户的 crontab 文件:
crontab -e
#删除当前用户的 crontab 文件:
crontab -r
#列出某个用户的 crontab 文件(需要有相应的权限):
crontab -u username -l
#编辑某个用户的 crontab 文件(需要有相应的权限):
crontab -u username -e
(2)crontab内容
crontab 是指令,也是一个文件,用 crontab -e 可以打开该文件进行编辑,其规定语法如下所示:
具体的使用方法可以百度一下,这里仅引用一张说明图,其实就是“时间 命令”就行了。
(3)crontab定时删除
可以利用 crontab 功能实现定时清空 n 天前的 .Trash 内的内容。
例1:每周日晚上12点,清空 .Trash 文件夹下 7 天前的文件。
0 0 * * 1 find ~/.Trash -mtime +7 -exec rm -rf {} \;
例2:每天中午12点,清空 .Trash 文件夹下 3 天前的文件。
0 12 * * * find ~/.Trash -mtime +3 -exec rm {} \;
5 共享ETX和传送界面
芯片设计中常常遇到需要共享ETX,或传送某个界面给其他同事用,下面的指令会有帮助。
5.1 共享ETX
一般在开启 Terminal 的工具中,会有 Share 选项,输入对方名称后,两人可以共同操作该 Terminal。不想共享了还可以直接终止 Share。
- 优点:多人协同工作,方便快捷。
- 缺点:对方操作时,自己不能干别的活,因为两个人都对当前 terminal 控制有效。
- ETX一般可以同时存在两个,一个自己用,一个分享给别人。
- ETX分享的风险太大,出了什么事不好说。
5.2 传送界面
例如某个同事希望你分享个 verdi 给他,或者他在某个目录下没有权限,需要一段时间查看某些东西,那么可以传送指定界面过去。我们需要知道对方的 ETX 编号,一般是 ETX 左上角的那串字符编号。
- setenv DISPLAY 对方 ETX 编号
- 例如:setenv DISPLAY etx:3
- 输入要传送给对方的指令。
- 例如:gvim test.v、verdi、gnome-terminal等。
- setenv DISPLAY 自己 ETX 编号,后面的其他操作,图形界面会出现在自己界面,自己正常干活就行了。
- 例如:setenv DISPLAY etx:1
- 输入 ps -aux | grep “第二步指令”| grep 自己名字,找到刚刚分享过去的命令。
- 例如:ps -aux | grep verdi | grep jack
- 有的系统需要用 ps -ef 。
- kill -9 杀死刚刚分享过去的命令。
- 例如:kill -9 73566
这招可以用于所有的图形界面的分享。
5.3 其他方法
除了 setenv DISPLAY 指令,有些工具自带的选项也可以达到这个目的,下面是几个我用过的。
- xterm -display 对方 ETX 编号
- 贼丑,还不好用
- gnome-terminal --display 对方 ETX 编号
- OS6下实测可用,OS7下失效。
- verdi -f filelist.f -top tb_top -display 对方ETX 编号 &
同样可以用 ps 指令找到 PID,即可用 kill 指令结束这些发送过去的界面。
6、Linux奇怪bug
6.1 无法输入小键盘数字
Windows 和虚拟机 Linux 的小键盘数字开关是相反状态,Windows 下能输入小键盘数字,则虚拟机 Linux 下不能输入,按一下小键盘数字的解锁按钮就行了。暂时没有找到二者为何相反、如何恢复的办法。
6.2 鼠标双击后跳行
鼠标双击后,Terminal 会自动跳到下一行,原因可能是 Windows 下的 [有道翻译] 或 [百度翻译] 等应用,开启了“划词翻译”,将其关闭即可。
6.3 home下出现core文件
在一个程序奔溃时,Linux 一般会在家目录下存储一个 core 文件,这只是一个内存映像(同时加上调试信息),主要是用来调试的,如果不需要调试,可以直接删除。