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 ~/.cshrcsource ~/.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)网络搜索

(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 等。
    • 联网安装:aptapt-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 左上角的那串字符编号。

  1. setenv DISPLAY 对方 ETX 编号
    • 例如:setenv DISPLAY etx:3
  2. 输入要传送给对方的指令。
    • 例如:gvim test.v、verdi、gnome-terminal等。
  3. setenv DISPLAY 自己 ETX 编号,后面的其他操作,图形界面会出现在自己界面,自己正常干活就行了。
    • 例如:setenv DISPLAY etx:1
  4. 输入 ps -aux  | grep “第二步指令”| grep 自己名字,找到刚刚分享过去的命令。
    • 例如:ps -aux | grep verdi | grep jack
    • 有的系统需要用 ps -ef 。
  5. 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 文件,这只是一个内存映像(同时加上调试信息),主要是用来调试的,如果不需要调试,可以直接删除。

 

posted @ 2023-07-01 17:06  咸鱼IC  阅读(2413)  评论(0编辑  收藏  举报