GNU/Linux常用shell命令

本文介绍了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 选项相同)。
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容