本文介绍了GNU/Linux中常用的shell命令
1. whoami
打印出当前在 terminal session 中登陆的用户名
2. man
man <command>
打开帮助手册,查看如何使用某个命令
3. clear
清空指令,清除前面的所有命令
可选项: clear -x
,这样原来的指令还可以上滑找到
4. pwd
打印当前的文件路径
5. ls
在一个文件夹里时,打印这个文件夹里所有的文件
ls /bin
如果在后面加上一个文件名,它也会打印出这个文件夹里的内容。如果在当前文件夹里,可以用相对路径,否则要绝对路径(/ 开头,表示根路径)。
ls -a -l
:可以看到所有文件(包括 . 开头的文件),一行一行地显示(这样很清楚!)
ls -lh
:这个最实用,可以显示文件的大小(以 human 阅读的方式,即 KB, MB, GB),并逐行显示。
6. cd
cd
.. 返回上级菜单(注意,cd 和 .. 之间要有空格!!)
cd </path>
可以直接跳转到需要的路径
7. mkdir
创建文件夹
mkdir fruits
还可以用一行指令创建多个文件夹
mkdir dogs cars
还可以创建多层的文件夹,通过添加 -p
指令:
mkdir -p fruits/apples
,注意这里, -p
表示 -parent
。如果没有父文件会创建父文件。
8. touch
使用 touch
创建一个空文件(可指定类型),或者更新文件的时间戳
touch apple
也可以指定文件的类型:touch melon.txt
可以指定任何类型的空文件:touch apple.pdf
touch berry.png
而如果这个文件已经存在,命令则以修改模式 write mode 打开这个文件名,并且更新文件的时间戳。
9. rmdir
类似我们用 mkdir
创建文件夹,我们用 rmdir
删除一个文件夹
mkdir fruits
rmdir fruits
也可以一次性删除多个文件夹,只需要把文件夹的名字列在后面就行了:
mkdir fruits cars
rmdir fruits cars
注意:你删除的文件夹必须是空的!
对于内含文件内容的文件夹,我们用更为通用的 rm
命令来同时删除文件和文件夹
10. rm
删除文件或者文件夹。
- 逐个删除文件:
rm carrot cat.png dog.pdf
- 如果在命令中加
-v
则可以查看 verbose 信息,即打印出具体删除了哪些文件
rm -v cat dog carrot
- 删除文件夹和里面的文件:需要增加
-r
,表示迭代地删除。否则会报错:rm xxx: is a directory
rm -r seeds
- 加
-rv
则可以在迭代删除的过程中,查看 verbose 信息,打印出删除了哪些文件
rm -rv seeds
- 加
-ri
会逐个确认文件夹里的每个文件是否删除,这样可以选择部分不删除
rm -ri animals
11. open
使用 open 指令可以让你打开一个文件:
open <filename>
你也可以打开一个目录,比如在 macOS 中会用你输入的目录路径打开 Finder app 程序:
open <directory name>
而使用 open . 则可以直接用 Finder 打开当前路径(超实用!):
open .
12. mv
当你有一个文件,你可以使用 mv 指令移动它。需要指定这个文件当前的路径,以及它的新路径。
- 如果未指定路径,而是文件名,则相当于
rename
修改文件名:
touch pear
mv pear new_pear
- 如果指定路径,则会将文件存进文件夹里
mv purple.txt testfile
- 如果增加 -v 则可以显示 verbose 信息,打印文件是如何移动的
mv -v purple.txt testfile
- 也可以修改文件夹的名称:
mv stuff/ STUFF
- 移动文件夹的地址,比如将文件夹地址放到上一层级:
mv -v testfile/Stuff ../
13. cp
你可以用 cp 指令拷贝一个文件:
touch test
cp apple another_app
若要拷贝文件夹,你需要添加一个 -r
的选项来递归地拷贝整个文件夹中的内容:
mkdir fruits
cp -r testfile another_testfile
还可以既拷贝、又改名、又移动位置:
cp testfile/red.png another_testfile/red2.png
14. head
输出文件的第一部分,使用 -n 可以指定长度
head SongOfMyself.txt
15. tail
类似 head
的功能,输出文件的末尾内容。
16. date
打印当前的系统时间
date
还可以通过 > 或者 >> 指令将 date 信息写入 .txt 文件:
覆盖原有内容:date > today.txt
在原有基础上添加:date >> today.txt
现在查看现在这个文件的前几行:
head today.txt
17. cat
名字的全称: cat – concatenate and print files
和 head/tail 的功能有些相似,与之不同的是 cat 可以在一个 file 中添加内容,这让这个指令非常有用。
- 打印文档的所有内容:
cat spring.txt
- 如果在前面加 -n,可以显示行号
cat -n spring.txt
- 打印两个文档的额所有内容:
cat spring.txt today.txt
- 还可以通过前面学的 > 指令,将多个文件的内容写入到创建的新文件中:
cat spring.txt today.txt > everything.txt
18. less
也是用来查看文件内容的,但相比于 head/tail, cat 等,有更好的 UI,效果和用 man 指令的效果类似。
按 q 可以退出显示页面,这样主页面就不会被大量的文本内容淹没了。
其他小指令:
按 g 可以跳到开头;
按 G 可以跳到结尾。
19. echo
这个指令只做一件简单的事:把输入的文本打印下来:
echo "hello"
不是很有用。但是可以结合 > 指令来迅速创建一个包含少量文本的文件(这个比较实用~):
echo "hello" > echo.txt
并且还能通过 >> 重复上述步骤来给这个 .txt 文件添加多行:
echo "the second line" >> echo.txt
20. wc
指令的全名:word count
- 这个指令给我们某个文件或者通过它从 pipes 接收到的指令中的有用的信息。
wc mySongLyrics.txt
输出:1757 15767 87022 mySongLyrics.txt
第一个表示有多少行,第二个表示有多少字,第三个表示多少字节,第四个是文件名
- 若添加
-l
可以只看有多少行; - 若添加
-w
可以只看有多少字。 - 通过
pipes
的方式,它还可以结合其他语句,比如:
输出某个文件有多少行:
cat spring.txt | wc -l
21. sort
排序文件中的内容。也可以类似 wc,用 pipe 的方式使用
大小写是大写在前,但也可以通过附加指令忽略大小写。
数字排序要加 -n,否则会按照首数字排序:
cat nums.txt
sort -n nums.txt
如果只打印出 unique 的值的排序结果,可在前面加 -nu
:
sort -nu nums.txt
用 pipe 的方式使用,结合 cat 的多个文件:
cat nums1.txt nums2.txt | sort
还可以用 pipe 的方式,直接和 wc 一起使用,统计有多少不一样的行:
sort -nu nums.txt | wc -l
22. uniq
删除挨在一起的重复的内容,注意如果不挨在一起不会删除。因此需要先排序,再 uniq。
- 结合 pipe 的方法:
sort favflavor.txt | uniq
效果和 sort -u
是一样的。
- 不过
uniq
还是有它的独家功能: -d
:只选出有重复项的:
sort favflavor.txt | uniq -d
- -u:只选出没有重复项的:
sort favflavor.txt | uniq -u
- -c:对所有项的频数统计:
sort favflavor.txt | uniq -c
- 统计后,再排序:
sort favflavor.txt | uniq -c | sort -nr
23. extensions
可以通过 echo/ls+ extensions
获取文件:
获取所有 .png 文件
echo *.png
枚举所有 .ipynb 文件:
ls *.ipynb
枚举所有 F 开头的文件:
echo F*
24. diff
逐行比较两个文件。
这是一个很好用的指令。假设你有 2 个文件,几乎包含了相同的信息,但是你找不到两个文件到底在哪里有差别。此时, diff 就会处理这些文件并且告诉你差异是什么。
假设你有两个文件:dogs.txt 和 moredogs.txt。差别在于后者多一个狗狗的名字。
25. find
用于搜索符合某个搜索模式的文件或者文件夹。它以迭代的方式搜索。
- 比如搜索所有 .js 后缀的文件,并且打印它们的相对地址:
find . -name '*.js'
- 这里的 . 表示当前的路径下。也可以修改路径,搜索别的地方:
find testfile -name '*.jpg'
- 精确搜索文件名:
find . -name '7'
- 模糊搜索:
find . -name '*7*'
- 还可以进行更复杂的检索,比如检索类型为 file,大小在 100k 和 1M 之间的文件:
find . -type f -size +100k -size -1M
- 再比如检索超过三天前更新的文档:
find . -type f -mtime +3
- 再比如检索在 24 小时内更新的文档:
find . -type f -mtime -1
再比如,为每一次搜索结果执行一次命令。在下面这个例子中我们运行了 cat 来打印文档内容:
find . -type f -exec cat {} \ ;
注意,{}会被文件名替代。
26. grep
全称:global regular expression print。主要用来检索文档内部。
这是一个非常实用的指令,如果你掌握了,它可以极大地帮助你。
你可以用 grep 来检索文件,或者结合 pipe 来过滤任何指令的输出。
比如说下面这行指令可以帮助我们找到在 index.md 文档中,document.getElementById 所在的行:
grep document.getElementById index.md
若添加 -n,可以返回对应的所在行号:
grep -n cat allPets
如果添加 -r 可以迭代地检索所有文件:
grep -n cat allPets
grep -nr cat allPets
(既显示行号,也显示所有包含字符的文件)
而且 grep 支持正则表达式,很实用!
27. du
全称:display disk usage statistics
用来计算整个 directory 的大小。
du
可以增加 -m 表示用 MB 表示大小;-g 表示用 GB 表示。
使用 -h 可以给出 “human -readable” 的输出,会加上单位:
du -h myTestFile
28. df
全称:display free disk space
用来得到磁盘使用信息。基本的使用方式是打印出有关资源使用情况的信息
同样,使用 -h 可以加上单位,更具可读性
df -h
29. history
每一次我们执行的指令都会被记录在 history 里面,你可以展示 history:
history
还可以结合 less 的 pipe 来在新的 UI 窗口中浏览:
history | less
30. ps
全称:process status
你的电脑无时无刻不在运行成千上万的不同进程。可使用 ps 指令来检查所有的进程的状态
ps ax
31. top
展示和更新关于进程的排序后的信息
top
包含 command, %CPU,Time,memory等等
也可以按照占用内存来排序(排在越前面,表示内存占用越多):
top -o mem
32. kill
全称:terminate 或者 signal 一个进程。
GNU/Linux 中的进程可以接受 signals 并给出反馈,kill 指令就是我们与正在运行的程序进行交互的一种方式。
kill 指令可以给程序发送多种多样的 signals,不仅仅是它名字所暗示的终止程序。
通常 kill 直接加进程的 ID 以终止进程(默认是发送 -15 SIGTERM 指令,比较温和):
kill <PID>
我们也可以用 -l 列举出所有的指令:
kill -l | less
很多人会使用 -9 的 SIGKILL,以一种很暴力的方式强退程序,不过还是建议先用 -15 的SIGTERM(以正常的方式让程序退出),如果不起作用再用 SIGKILL。
33. killall
类似 kill 指令,但是 killall 并不是针对某个单一的进程 ID 发送信号,而是同时发给多个进程。
语法:
killall <name>
这里的 name 是程序的名字。比如说你有很多个叫 top 的 program 在运行,那么 killall top 就会把它们同时终止(terminate),比如:
killall -9 node
你也可以类似 kill 的应用,指定一个信号:
34. jobs
当我们在 GNU/Linux或macOS 上运行指令时,我们可以使用 & 符号把它发送到后台(background)去运行,比如我们可以将 top 在后台运行:
top &
这对于运行时间很长的程序来说是一个很实用的指令!
执行后,我们可以通过 fg 指令回到这个程序。当我们只有 1 个 job 的时候,这个指令很好用,否则我们需要 job 的编号,比如 fg1, fg2 等等。为了得到 job 的编号,我们可以使用 jobs 指令:
jobs
这样我们就可以看到那些被 suspended 的程序了(对于用 Ctrl + Z 暂停的指令也同样适用)。
35. fg
全称:foreground
由于你使用了 & ,当一个指令正在后台运行时,你可以让它重新回到 foreground 通过 fg 指令。当你只有一个 suspended 的程序时:
fg
该指令会恢复最后一个被 suspended 的 job。
你也可以通过 job 编号指定你要恢复哪一个 job:
jobs
在 bash 中:
fg 2
在 zsh 中(macOS 现在使用的 Terminal 程序):
fg %2
36. bg
让进程在后台 Running。
jobs
bg %2
sleep 50 &
jobs
37. sleep
中止执行持续一段时间
比如休眠 50 秒:
sleep 50
38. gzip
用来压缩文件。
- 基本指令如下,这将会对文件进行压缩,并添加 .gz 的后缀。注意,原始的文件会被删除。:
gzip filename
- 如果你不想删除原文件,可以加 -c 可选指令,并用 > 将输出写入新的文件(可以给 .gz 命名新的文件名):
gzip -c filename > filename.gz
- 或者直接用 -k 可选指令:
gzip -k filename
- 如果添加 -v 可以知道节约了多少空间
gzip filename.gz
- 也可以叠加 -k 和 -v(推荐!):
gzip -kv filename.gz
- 也可以用 gzip 指令来解压缩文件:
gzip -d filename.gz
39. gunzip
- 专门用来解压缩的指令。它基本上就是 gzip -d 的简短形式。
gunzip filename.gz
40. tar
这个命令用来创建一个 archive 存档,它将会把多个文件 group 进一个新的文件。
- 注意,原来的文件将不单独存在。类似装进文件夹的逻辑。
指令如下,会创建一个包含 file1 和 file2 且名叫 archive.tar 的 archive 存档:
tar -cf archive.tar file1 file2
这里的 -c 指令表示 create。这里的 -f 指令用来写入文件
- 下面这个指令可以用来从 .tar 中提取文件:
tar -xf archive.tar
- 如果想要把它们提取到某个指定的地方,可以用这个指令:
tar -xf archive.tar -C directory
- 通常,tar 和 gzip 可以联合使用,达到非常实用的“打包 + 压缩 ️” 的效果!指令如下:
tar -cf archive.tar file1 file2
gzip -k archive.tar
这样,我们就可以获得著名的:.tar.gz 后缀的文件:archive.tar.gz
- 至于生成、解压和提取 .tar.gz 文件,有两种方式:
第一种是分两步:
创建:先 gzip 再 tar
解压和解打包:先 gunzip 在 tar -xf
第二种是一步搞定(推荐!!⭐️):
创建:tar -czf archive.tar.gz file 1 file 2
解压和解打包:tar -xf archive.tar.gz
41. nano
这是一个对初学者很友好的编辑器:
nano <filename>
你可以直接在里面敲字符。
退出编辑:
ctrl-X
保存编辑:
Ctrl-S
切断行:
Ctrl-K
42. alias
(注意:zsh 需要额外配置)
允许我们自定义自己的命令。
比如我们常用 ls -la,那么我们可以把它存成一个自定义别名的命令:
alias myls = 'ls -la'
而运行 alias 本身,则可以查看自己的所有alias:
alias
43. xargs
通过这个指令,你可以让某个指令的输出,成为另一个指令的输入:
command1 | xargs command2
比如,我们想将一个 .txt 文件里列举所有文件都删除,则可以先 cat 读取文本内的所有内容,然后删除:
cat deadPlayers.txt | xargs rm
再比如:
find . -size +1M | xargs ls -lh
44. ln
这个指令是GNU/Linux 文件系统指令中的一部分。它用来创建 links。
什么是 link 呢?link 是指向另一个文件的指针。一个文件指向另一个文件。
如果你熟悉 Windows 的快捷键,那它们的功能很相似。
有两种类型的 links:
第一种:hard links
hard links 很少使用。它们有一系列的限制:你不能链接到 directories,也不能链接到外部的文件系统(磁盘)。
ln <original><link>
第二种:soft links
echo "I am original" > original.t
ln -s original.txt symlink.txt
45. who
这个指令陈列橱登入系统的 users 用户名。
除非你在用的是很多人共享的服务器,否则通常你是唯一一个登录系统的人,登录过很多次。
46. su
当你以某个 user 身份登陆了终端 shell 的时候,你可能需要切换成另一个 user。
比如你先以 root 执行了某些指令,但是你接下来想要切换 user 账号,那么你可以使用 su 指令:
su <username>
su flavio
而如果你现在正以一个普通 user 的身份,运行 su 指令本身即可让你切换成 root user
47. sudo
这是一个非常常用的指令,用来作为 super user 运行 root 一个指令。
你必须能够使用 sudo,并且一但是这习惯了们可以通过你的 user 密码来像 root 一样发出指令(而不是 root 的密码)。
而这个准许是高度可配置的,尤其是在多用户的服务器环境中。
比如,你可以编辑一个系统的配置文件:
sudo nano /etc/hosts
48. passwd
GNU/Linux 中的 users 都有指定的密码。你可以使用 passwd 指令来修改密码。
有两个场景:
第一个是当你想要修改密码的时候,你可以输入:
passwd
然后一个可交互的界面会弹出来,问你旧密码是什么,然后会问你新密码。
49. chown
在GNU/Linux 和 macOS (以及几乎每一个类 Unix 的系统)中,每一个 file/directory 都有其 owner。
文件的 owner 可以对这个文件做任何事情,主宰这个文件的命运。
文件的 owner(以及 root user)也可以修改这个文件的 owner,把它给别人。
用到的指令就是 chown:
chown <owner> <file>
如果你想要修改 directory 的 ownership,那么需要迭代地修改,那么就要加一个 -R 的指令:
chown -R <owner><dile>
50. chmod
全称:change file mode
每一个在GNU/Linux 和 macOS (以及几乎每一个类 Unix 的系统)中的文件都有 3 个permissions:read, write, execute。
基本语法:
chmod mode file
51. uname
uname(unix name)命令用于显示操作系统信息,例如内核版本、主机名、处理器类型等
语法:
uname [-amnrsv][--help][--version]
参数说明:
-a
或--all
显示全部的信息,包括内核名称、主机名、操作系统版本、处理器类型和硬件架构等。。-m
或--machine
显示处理器类型。-n
或--nodename
显示主机名。-r
或--release
显示内核版本号。-s
或--sysname
显示操作系统名称。-v
显示操作系统的版本。--help
显示帮助。--version
显示版本信息。-p
显示处理器类型(与-m
选项相同)。
暂无评论内容