我觉得我效率最高的时候,就是我在使用 Shell 的时候。因为这个时候,只要疯狂敲键盘就可以了。
我统计了 Macbook Pro 和几个服务器上 history 中命令历史记录,然后根据频率生成了下面这张词云图。

日常使用的就是这么几个命令。
cd ls mv cp rm mkdir rmdir vim ….
简单的命令结合不一样的参数会有不同的用法,接下来的这些命令都是我觉得平常比较有用的,对于新手来说一时肯定记不住,但是可以看一遍记住可以shell是可以实现这些功能的,在需要的时候,可以来这里查找或者去网上查找,包括学习其他语言也是首先要知道程序可以实现哪些功能(打破信息差),需要的时候再去寻找。

ls (list)

1
2
3
4
5
6
ls # 列出当前目录下的文件 默认是按英文a-z排序
ls -r # 反序显示 就是z-a排序
ls -l # 列出详细信息包括权限 链接数 用户组 用户 大小 修改日期
ls -a # 列出所有文件,包括隐藏文件 在linux中 . 开头的就是隐藏文件或者隐藏文件夹
ls -R # 递归显示,显示子目录下的文件,以及子目录下的子目录下的文件,以此类推,就跟tree命令差不多
ls -t # 按照修改时间排序 越新的越前 这个很有用,文件多的时候,就容易忘记最近操作的文件或者文件目录是哪个

cd (change directory)

1
2
3
4
5
6
7
8
9
cd # 切换目录

cd .. # 切换到上一级目录
cd - # 切换到上一次所在的目录
cd ~ # 切换到Home目录
cd / # 切换到根目录

cd dirs # 切换到相对路径
cd /home/username/dirs # 切换到绝对路径

mv (move)

1
2
3
mv file1 file2 # 将file1重命名为file2
mv file1 file2 dir # 将file1移动到dir目录下,并重命名为file2
mv file1 file2 file3 dir # 将file1 file2 file3 移动到dir目录下

mkdir (make directory)

1
2
mkdir dir # 创建一个目录
mkdir -p dir1/dir2/dir3 # 创建多级目录

rmdir (remove directory)

1
2
rmdir dir # 删除一个空目录
rmdir -p dir1/dir2/dir3 # 删除多级目录,只有当目录为空时才能删除

rm (remove)

1
2
3
4
rm file # 删除文件
rm -r dir # 递归删除目录,即删除该目录以及该目录下的所有内容 这个命令非常危险!!!
rm -f file # 强制删除文件,有些文件被保护的话可以使用该命令直接删除
rm -rf dir # 强制递归删除目录即叠加上面两个命令,执行后整个dir直接没了包括里面被保护的文件 这个命令非常危险!!!

我有几次使用 rm -rf 的时候结合ohmyzsh的tab导致选错了目录,删除错了好几次文件夹。所以在执行删除文件的时候一定要小心。我现在删除目录的方法选择一种更为稳妥的方法。比如说现在想删除一个目录remove_test,我会先 cd 进入该目录,然后执行 rm -r * ,这里*是通配符,表示所有文件和文件夹。并使用ohmyzsh的tab补全文件名,确保删除的是我想要删除的,然后cd ..;rmdir remove_test,确保删除的是空目录。误删的后果真的是太严重了😭😭😭。
下面是具体例子:

1
2
3
4
5
6
7
8
9
10
11
(default) migie:~/ $ cd remove_test                                  [16:23:09]
(default) migie:remove_test/ $ ls [16:23:12]
dir01 dir03 dir05 dir07 dir09 file01 file03 file05 file07 file09
dir02 dir04 dir06 dir08 dir10 file02 file04 file06 file08 file10
(default) migie:remove_test/ $ rm -r dir01 dir02 dir03 dir04 dir05 dir06 dir07 dir08 dir09 dir10 file01 file02 file03 file04 file05 file06 file07 file08 file09 file10
(default) migie:remove_test/ $ ls -a [16:23:16]
. ..
(default) migie:remove_test/ $ cd .. [16:23:21]
(default) migie:~/ $ rmdir remove_test [16:23:23]
remove_test
(default) migie:~/ $ [16:23:26]

cp (copy)

1
2
cp file1 file2 # 复制文件
cp -r dir1 dir2 # 递归复制目录

head tail

1
2
3
head -n 1 file # 显示文件的第一行
tail -n 1 file # 显示文件的最后一行
tail -n 1 */result # 显示当前目录下所有result文件的最后一行

awk grep sed

1
2
grep "pattern" file # 在文件中查找pattern
grep -r "pattern" dir # 递归查找目录下的文件

awk

1
2
awk '{print $1}' file # 显示文件的第一列
awk -F: '{print $1}' file # 以:为分隔符显示文件的第一列

sed

1
sed 's/old/new/g' file # 将文件中的old替换为new

awk grep sed 是三个非常强大的文本处理工具,可以实现很多复杂的功能,这里只是简单的介绍了一下,具体的用法可以查看man手册或者网上的教程。

tar

1
2
tar -czvf dir.tar.gz dir # 压缩目录
tar -xzvf dir.tar.gz # 解压文件

shell 的通配符

1
2
3
4
5
* # 匹配任意字符
a* # 匹配以a开头的任意字符
*a # 匹配以a结尾的任意字符
? # 匹配一个字符
[] # 匹配括号中的任意一个字符

软链接

软链接类似于 Windows 中的快捷方式,软链接在文件系统管理中非常灵活,可以用于简化路径访问、创建快捷方式等场景。

1
ln -s /home/user/file.txt /home/user/links/mylink

批量操作

shell 是一种批处理语言,可以很方便的进行批量操作。

1
2
3
4
5
6
for i in {01..10}; do echo $i; done
# 这是for的基本语法,$ 是变量的引用,这个命令是输出01到10的数字
for i in {01..10}; do touch file$i; done
#这个命令是创建file01到file10的文件
for i in {01..10}; do mkdir dir$i; done
#这个命令是创建dir01到dir10的目录

在日常中,批量操作非常灵活,只要你想得到,shell都可以实现。
这些是我在日常生活中,经常使用到的

1
2
3
4
5
6
for i in *;do cp $i/CONTCAR zzz/$i.vasp;done
# 这个命令是将当前目录下所有目录中的CONTCAR文件复制到zzz目录下,并重命名为目录名.vasp
for i in *.vasp;do mkdir ${i/.vasp};mv $i ${i/.vasp}/POSCAR;done
# 这个命令是将当前目录下所有vasp文件的文件名去掉.vasp后缀,创建目录,然后将文件移动到目录下,并重命名为POSCAR
for i in *;do echo -n $i,;tail -n 1 $i/331/OSZICAR|awk '{print$5}';done
# 这个命令是输出当前目录下所有目录中331目录下OSZICAR文件的最后一行的第五列

这些就是我在日常中经常使用的shell命令,希望对你有所帮助。每一个更大的程序都是由很多小的程序组成的,结合上面这些基础的命令,可以实现很多复杂功能。