进阶
稍微复杂一些的BASH命令,掌握后可加快Linux使用效率。
以下命令的更多用法可以参考:菜鸟教程-Linux命令大全
关于Linux系统知识可以参考:鸟哥的Linux私房菜
相关书籍分享:百度云盘(密码:u34s)
通配符
通配符常用于模糊匹配文件或目录名,个人常用于for循环、grep查找等等场景,详细说明和用法可参考。常见通配符包括:
-
*:匹配任意长度的任意字符 -
{string1,string2}:匹配string1或string2
常见用法:
# 打印所有以.py结尾的文件
$ ls *.py
# 对dirname目录所有文件进行查找
$ grep -r "hello" dirname/*
# 用VIM编辑器同时打开多个以.data结尾的文件
$ vim -p *.data
# 对当前目录的每个文件进行循环
$ for i in *;do echo $i;done
# 同时复制多个文件到当前目录
$ cp dirname/{INCAR,POSCAR,KPOINTS,POTCAR} .
管道
重定向
重定向分为输入重定向和输出重定向,详细内容可参考菜鸟教程-Shell 输入/输出重定向。
标准文件描述符
| 文件描述符 | 缩写 | 描述 |
|---|---|---|
| 0 | STDIN | 标准输入 |
| 1 | STDOUT | 标准输出 |
| 2 | STDERR | 标准错误 |
对于终端界面来说,标准输入是键盘,标准输出是屏幕。所谓的输入/输出重定向就是将标准输入/输出/错误从键盘/屏幕转移至文件。
输入重定向
一个命令通常从标准输入(默认为终端)读取输入,使用command < file可将文件内容重定向到命令,即从文件读取输入。这种重定向个人使用的不多,另一种输入重定向称为内联输入重定向,符号为<<。这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。个人只使用cat写入文件:
# bash script
cat > hello.sh << !
string="Hello, this is a test."
echo \$\{string\}
!
Note:
- 必须指定一个文本标记来划分输入数据的开始和结尾。如本例
!,其他常用EOF - 注意特殊字符用
\转义
输出重定向
输出重定向将命令产生的屏幕输出重定向至另一个位置(通常为文件),常用的重定向操作包括,>,>>,1>,2>,&>,1>>,2>>,&>>,tee。
>和>>
>和>>是最基本也最常用的输出重定向命令,输出重定向至文件后屏幕将不会打印命令运行结果,二者的区别是> file将新建或覆盖(当file已存在时)file文件,而>> file将新建(当file不存在时)或追加内容到file文件。
# 打印所有的模块到文件
$ module avail > out.log
# 追加当前目录文件详细信息到文件
$ ls -l >> out.log
1>,2>,&>,1>>,2>>和&>>
在>或>>前添加特殊文件描述符1、2,可指定将标准输出和标准错误输出至文件,而&分别表示将正确输出、错误输出、所有输出进行重定向,常用操作为:
# 只重定向正确输出
$ command 1> right.log
# 将错误输出丢弃
$ command 2>> /dev/null
# 将正确输出和错误输出分别重定向
$ command 1>> right.out 2>> wrong.out
# 将正确输出和错误输出同时输出至一个文件
$ command &> out
$ command > out 2>&1
Note:
-
>和>>默认重定向正确输出,等价于1>和1>> -
&>等价于>&和2>&1,一般用&>即可 -
/dev/null是Linux系统的特殊文件(可理解为垃圾桶),重定向至该文件的输出将全部消失
tee
前述的输出重定向都不会在屏幕显示输出,而tee命令配合管道可同时将正确和错误输出在屏幕并重定向至文件。tee命令用于读取标准输入的数据,并将其内容输出成文件。其一般使用如下:
$ vasp_std | tee out.log
Note:-a选项,附加到既有文件后面,而非覆盖它。
查找
grep命令用于查找文件里符合条件的字符串,详细使用请参考菜鸟教程-Linux grep命令,常用选项包括:
-
-n:打印行号 -
-r或-d:对目录递归查找 -
-e或-E:根据正则表达式查找
其它查找命令还包括:
-
egrep:使用扩展的正则表达式匹配文本,详见菜鸟教程-Linux egrep命令 -
rgrep:递归查找目录及文件中的文本,详见菜鸟教程-Linux rgrep命令 -
fgrep:相当于grep -F
压缩和归档
Linux中的文件压缩工具有bzip2(.bz2)、compress(.Z)、gzip(.gz)、zip(.zip),但Linux系统中使用最广泛的归档工具是tar命令,常见用法包括:
# 创建压缩/归档文件
$ zip
$ tar -cvf file.tar file1 file2 dir1 dir2 ...
# 从常见压缩/归档文件提取内容
$ unzip file.zip
$ tar -xvf file.tar
$ tar -zxvf file.tgz
$ tar -zxvf file.tar.gz
Note:可以将多个文件目录归档,通过一次性从远程服务器下载至本地
链接
Linux中的链接可分为软链接和硬链接,软链接相当于Windows系统中的快捷方式。硬链接可理解为创建一个新的指向源文件地址(inode)的文件名。硬链接和源文件可理解为同一个地址映射为两个文件名,而软链接可理解为指向源文件名的映射。二者具有以下特点:
- 硬链接与源文件共享内存地址,删除源文件后,硬链接仍有效;而软链接会开辟新的内存地址,删除源文件后,软链接将失效
- 不论删除软链接还是硬链接,都不会删除源文件
- 硬链接只能对文件创建,而软链接对于文件和目录均可
- 硬链接不能给不同文件系统的文件创建,而软链接可对任何文件系统创建
- 移动源文件路径后,软链接将失效,而硬链接不会
硬链接的作用在于备份,可为重要文件创建硬链接,如果误删该文件,则仍可使用硬链接访问。而软链接的作用与Windows快捷方式相同,为目录层级比较深的目录或文件创建软链接至常用的目录位置,类似于Windows下为软件创建桌面快捷方式。ln命令用于创建软、硬链接,常用命令如下:
# 为文件创建硬链接
$ ln file file.hard # .hard后缀名仅作为标识
# 为文件或目录创建软链接
$ ln -s file file.soft
$ ln -s dirname dirname.soft
Note:目录软链接删除时,不需要-rf选项,目录名后不要带/,如果带/很容易将源目录删除。
环境变量
目录切换
当需要在多个复杂层级目录来回切换时,使用cd命令进行切换就会比较麻烦,此时可以使用pushd和dirs命令,常见用法如下:
# 进入dirname目录,并将dirname压入目录栈中
$ pushd dirname
# 查看目录栈,第一列为编号
$ dirs -v
# 切换到编号为n的目录
$ pushd +n
目录栈是保存目录名的一个栈结构,编号0表示当前目录。日常使用只需要将目录压入栈中,通过dirs -v查看目录编号,再使用pushd +n切换到编号n对应的目录即可。
Note:pushd如果不跟任何参数则栈顶层的两个目录进行切换,相当于cd -