假如有一个文件夹,那么你可以用 cd
命令来打开它。 cd
是 change directory(改变目录)的缩写。同样,你可以在后面加上文件夹的名字,或完整的路径,来访问某个特定的文件夹。
示例:
mkdir fruits
cd fruits
现在你进入了 fruits
文件夹。
你可以使用 ..
这个特殊的路径来代指上级目录。
cd … #回到上级目录
在这里,井号(#)表示注释的开始,在它之后的整行内容都是注释。
..
也可以用来组成路径:
mkdir fruits
mkdir cars
cd fruits
cd …/cars
另一个特殊路径是 .
,它指代的是当前所在的文件夹。
你也可以使用绝对路径,也就是从根文件夹 /
开始的位置:
cd /etc
Linux 中的 pwd
命令
如果你在文件系统里迷路了,输入 pwd
,它会显示你现在的位置:
pwd
这条命令输出当前所在文件夹的路径。
Linux 中的 mkdir
命令
使用 mkdir
命令创建新的文件夹:
mkdir fruits
这条命令还可以一次创建多个文件夹:
mkdir dogs cars
你也可以添加 -p
参数,创建多个嵌套的文件夹:
mkdir -p fruits/apples
UNIX 命令的参数通常都是这样的形式,只需要在命令的名字之后加上它们,就可以改变命令的工作方式。你可以同时使用多个参数。
你可以通过 Man 页面查找某个命令支持的具体参数,只需要输入 man <命令名>
。现在,你可以试试输入 man mkdir
,来查看这一命令的参数(按下字母q
以退出 Man 页面)。 Man 页面是 UNIX 上非常棒的内置帮助系统。
Linux 中的 rmdir
命令
如上所述,mkdir
命令可以创建文件夹,与之相反,rmdir
命令用来删除文件夹:
mkdir fruits
rmdir fruits
这个命令也可以一次删除多个文件夹:
mkdir fruits cars
rmdir fruits cars
用这个命令删除的文件夹,必须是空的。
如果要删除含有内容的文件夹,这里有一个更通用的命令:rm
,配合 -rf
参数即可同时删除文件夹和其中的文件:
rm -rf fruits cars
请小心操作,这个命令在执行时不会向你确认,而是立刻删除你指定的文件。
用命令行删除文件,是没有回收站存在的,恢复丢失的文件会很难。
Linux 中的 mv
命令
当你有一个文件时,你可以用 mv
命令移动它。只需要指定文件的当前路径和新路径:
touch test
mv pear new_pear
文件 pear
现在被移动到 new_pear
了。这也是为文件和目录进行重命名的方法。
如果你指定的最后路径是一个文件夹,那么前面路径中的文件将被移动到那个文件夹。这时,你可以列出一组要移动的文件,这些文件将被移动到最后一个参数中指定的路径:
touch pear
touch apple
mkdir fruits
mv pear apple fruits #文件 pear 和 apple 被移动到 fruits 文件夹
Linux 中的 cp
命令
cp
命令可以用来复制文件:
touch test
cp apple another_apple
要复制整个文件夹,可以添加 -r
参数来递归复制那个文件夹的内容:
mkdir fruits
cp -r fruits cars
Linux 中的 open
命令
open
命令可以让你打开任意一个文件,格式如下:
open <命令名>
你也可以用它打开目录。在 macOS 上,这个命令会打开访达(Finder)并显示你当前指定的目录:
open <目录名>
我一直使用下面的命令打开当前目录:
open .
特殊符号
.
代指当前目录, 而..
代指上级目录。
此外,它还可以用来打开一个应用程序:
open <应用程序名>
Linux 中的 touch
命令
touch
命令可以用来创建空白的文件:
touch apple
如果指定的文件已经存在,那么它将以写入模式打开文件,文件的时间戳(修改日期)也同时更新。
Linux 中的 find
命令
find
命令可以用来按特定的模式搜索文件和文件夹。它以递归的方式进行搜索。
让我们通过几个例子来学习它的用法。
你可以用下面的命令,查找当前目录树下所有扩展名为 .js
的文件,并输出每个匹配文件的相对路径:
find . -name ‘*.js’
在星号(*
)等特殊字符周围打上引号是很重要的,这可以避免 Shell 弄错它们的意义。
如果要查找在当前目录树下,所有与"src"这一名称匹配的目录,请输入:
find . -type d -name src
同理,如果只搜索文件,可以使用 -type f
参数;如果只搜索符号链接,可以使用 -type l
参数。
-name
参数对于大小写敏感。如果不需要区分大小写,你应该使用 -iname
参数。
你可以在不同的根目录树下搜索文件:
find folder1 folder2 -name filename.txt
要在当前目录树下搜索名称为 “node_modules” 或是 ‘public’ 的目录,请输入:
find . -type d -name node_modules -or -name public
你可以用 -not -path
参数排除某个路径:
find . -type d -name ‘.md’ -not -path 'node_modules/’
你还可以搜索当前目录树中内容超过 100 个字符(字节)的文件:
find . -type f -size +100c
搜索大于 100KB,但小于 1MB 的文件:
find . -type f -size +100k -size -1M
搜索至少 3 天前编辑的文件:
find . -type f -mtime +3
搜索最近 24 小时编辑的文件:
find . -type f -mtime -1
你可以使用 -delete
参数同步删除搜索到的文件。比如,下面的命令会删除最近 24 小时编辑的文件:
find . -type f -mtime -1 -delete
你还可以在每个搜索结果上同时运行某个命令。在这里,我们运行 cat
来输出搜索到的文件的内容:
find . -type f -exec cat {} ;
请注意结尾的 \;
。 命令执行时,搜索结果中的文件名会被自动填入花括号 {}
。
Linux 中的 ln
命令
ln
命令是 Linux 诸多文件系统命令的一部分。
它的用途是创建链接。“链接”是什么?链接就像是指针,指向另一个文件,或者说是指向另一个文件的文件。你可能熟悉 Windows 上的快捷方式,二者是类似的。
我们有两种类型的链接:硬链接和软链接。
硬链接
硬链接现在很少使用。它有一些弱点:你无法链接到目录,也无法链接到外部文件系统(磁盘驱动器)。
要创建一个硬链接,可以使用下面的语法:
ln <源文件路径> <链接路径>
例如,你有一个叫做 recipes.txt 的文件,你可以用下面的写法创建一个硬链接:
ln recipes.txt newrecipes.txt
这个新创建的硬链接和普通的文件没有什么区别:
现在,如果你编辑这对文件中的任何一个,另一个文件的内容也会随之更新。
即使你删除了源文件,链接文件仍然会包含源文件的内容。那是因为直到创建硬链接时,源文件还没有被删除。
软链接
软链接则有所不同,它更为强大一些,你可以用它链接到其他的文件系统和目录。但请注意,当你删除源文件时,这个链接会断掉。
你可以使用 ln
命令的 -s
参数创建一个软链接:
ln -s <源文件路径> <链接路径>
例如,你有一个叫做 recipes.txt 的文件。你可以用下面的写法为它创建一个软链接:
ln -s recipes.txt newrecipes.txt
这种情况下,当你用 ls -al
列出文件时,你可以看见一个特殊的 l
标记。在文件名的末尾有一个 @
符号,如果你启用了终端的显色,文件名还会有不同的颜色:
现在,如果你删除源文件,链接就会断掉,如果你在终端里尝试访问它,Shell 会提示 “No such file or directory” (没有这个文件或目录):
Linux 中的 gzip
命令
你可以使用 gzip
命令,从而使用一种称为 LZ77 的 gzip 压缩协议,来压缩文件。
以下是最简单的用法:
gzip 文件名
这会压缩指定的文件,并为它加上 .gz
扩展名。源文件会被删除。
如果不想删除源文件,你可以加上 -c
参数,然后使用输出重定向,将输出文件写到 filename.gz
中。
gzip -c filename > filename.gz
-c
参数用来指定输出文件进入标准输出流,同时保持原始文件的完整性。
或者使用 -k
参数:
gzip -k 文件名
文件有不同的压缩率。压缩率越高,压缩(或者解压)的时间就越长。压缩率等级一般从 1(速度最快,压缩效果最差)开始,直到 9 (速度最慢,压缩效果更好)结束。默认为 6 。
你可以用 -<数字>
参数指定使用的压缩率:
gzip -1 文件名
你可以压缩多个文件,只需要依次列出它们:
gzip file1 file2
你可以用递归的方式压缩某个目录包含的全部文件,只需要使用 -r
参数:
gzip -r 文件夹路径
-v
参数会输出文件压缩时的百分比信息。以下是它和 -k
(Keep 的简写) 参数并用时的情形:
gzip
命令也可以用来解压文件,只需使用 -d
参数:
gzip -d filename.gz
Linux 中的 gunzip
命令
gunzip
命令与 gzip
命令基本等同,但前者总是默认启用后者的 -d
参数。
可以用下面的方式调用这个命令:
gunzip filename.gz
这会执行解压,将压缩文件的 .gz
扩展名去除,并将结果放进 filename
文件中。如果相应文件已经存在,将会被提取结果覆盖。
你可以加上 -c
参数,使用输出重定向,将压缩文件解压到不同的文件名:
gunzip -c filename.gz > 另一个文件名
Linux 中的 tar
命令
tar
命令可以用来创建档案包,将多个文件打包为一个文件。
它的名称来源于旧时,意思是 tape archive(磁带档案) (很久以前档案都是用磁带存储的)。
下面的命令会将 file1
和 file2
打包成一个名为 archive.tar
的档案包文件:
tar -cf archive.tar file1 file2
c
参数是 create(创建) 的简写。f
参数则用来将合成的档案包写入一个文件。
要在当前文件夹下的某个档案包中提取文件,可以使用如下命令:
tar -xf archive.tar
参数
x
是 extract(提取) 的简写。
如果要提取文件到指定目录,应该使用下面的命令:
tar -xf archive.tar -C 目录路径
你也可以不提取文件,只罗列某个档案包里含有的文件列表:
tar
常用来创建压缩档案包。
这可以用 z
参数来完成:
tar -czf archive.tar.gz file1 file2
这就像是先创建了一个 tar 档案包,再运行 gzip
来压缩它。
如果你要提取一个被压缩的档案包,可以先使用 gunzip
或 gzip -d
来解压,再提取里面的文件。除此之外 tar -xf
也可以直接识别压缩的档案包,然后为你完成解压提取操作:
tar -xf archive.tar.gz
Linux 中的 alias
命令
通常情况下,人们总会使用一组喜欢的参数去运行一个程序。
此处用 ls
命令举例。默认情况下,它只输出少量的信息:
但如果你带上了 -al
参数,它会输出一些更有用的信息,像是文件的修改日期、大小、所有者、权限之类。它也会同时列出隐藏的文件(文件名以英文句号.
开头的文件):
你可以创建一个新的命令,比如我喜欢叫它 ll
,它是 ls -al
命令的一个别名。
方法如下所示:
alias ll=‘ls -al’
只要这么做了,你就可以像使用普通的 UNIX 命令一样,调用 ll
:
当调用 alias
,但不加任何参数时,它会列出已经定义的所有别名:
用以上方法定义的别名,在终端会话关闭后就会失效。
如果要让别名永久有效,你必须将其添加到 Shell 的配置文件中。如果你正在使用 Bash shell,配置文件可能是 ~/.bashrc
、~/.profile
或 ~/.bash_profile
,依据实际用法而定。
如果你定义的命令中存在变量,那么请注意引号的用法:如果使用双引号,变量会在进行定义时解析;如果使用单引号,变量则会在命令被调用时解析。两者是不同的:
alias lsthis=“ls $PWD”
alias lscurrent=‘ls $PWD’
$PWD 代表 Shell 当前所在的文件夹。如果你导航到新的文件夹,lscurrent
命令会列出新文件夹中的文件,而 lsthis
仍然会列出你首次定义变量时所在文件夹中的文件。
Linux 中的 cat
命令
cat
命令与后面会介绍到的 tail 命令有些相似,但 cat
命令可以向任一文件添加内容,这就使得它非常强大。
cat
最简单的用法是将任一文件的内容打印到标准输出中:
cat 文件名
你可以打印输出多个文件的内容:
cat file1 file2
配合输出重定向操作符 >
,你可以把多个文件的内容拼接成一个新的文件:
cat file1 file2 > file3
使用操作符 >>
,你可以将多个文件的内容附加到任一文件中,如果目标文件不存在,则会新建一个:
cat file1 file2 >> file3
当查看源代码时,读取行数是非常有用的。使用 cat
的参数 -n
即可完成:
cat -n file1
使用 -b
参数可以(同时也只能)向文件的非空行添加一个数字。而使用 -s
参数则可以移除文件中所有的多行空行。
cat
经常和管道符 |
一并使用,可以将任一文件的内容输入给另一个命令使用: cat 文件名1 | 另一个命令
。
Linux 中的 less
命令
less
是我经常使用的命令之一。它透过一个漂亮的交互用户界面向你展示任一文件中存储的内容:
用法: less <文件名>
.
当你处于 less
会话时,按下 q
键即可离开。
你可以使用 上
键和 下
键浏览文件的内容,或者使用 空格
键和 b
键逐页浏览。按下 G
键(大写)可以跳转到文件的末尾,而按下 g
键(小写)则可以回到文件的开头。
按下左斜杠键 /
并输入文字,就可以在文件中进行搜索。这会 向前 搜索。如果要向后搜索,你需要使用问号 ?
并输入文字。
这个命令只是将文件的内容可视化。你可以直接按 v
打开一个编辑器。它将使用系统编辑器,在大多数情况下是 vim
。
按 F
键即可进入 跟踪模式,也称 观察模式。当文件被别人修改时,比如从另一个程序中修改,你就可以 实时 看到修改的内容。
默认状态下不会出现这种情况,你只能看到你打开文件时的文件版本。你需要按 ctrl-C
来退出这个模式。在这种情况下,行为类似于运行 tail -f <文件名>
命令。
你可以打开多个文件,并使用 :n
(next,转到下一个文件)和 :p
(previous,转到上一个文件)浏览它们。
Linux 中的 tail
命令
在我看来,tail 命令的最佳用法是带上 -f
参数一起调用。它会打开并显示文件最末尾的内容,并实时监控文件的改动。
有新内容进入文件时,它就将其输出到终端窗口中。这对于查看日志文件是非常棒的。例如:
tail -f /var/log/system.log
要退出,就按下 ctrl-C
.
使用以下命令,你可以输出任一文件的最后十行内容:
tail -n 10 <文件名>
你还可以在行号前添加加号 +
指定从文件的某一行开始输出之后的所有内容:
tail -n +10 <文件名>
tail
还可以做更多的事情,像往常一样,我建议你去查询 man tail
了解更多。
Linux 中的 wc
命令
wc
命令会为我们显示关于指定文件(或透过管道符接收的参数)的有用信息。
echo test >> test.txt
wc test.txt
1 1 5 test.txt
以下是透过管道符的例子,我们可以利用它来给 ls -al
命令的运行输出计数:
ls -al | wc
6 47 284
第一列返回的是行数,第二列是字数,第三列则是比特数。
我们可以让它只计算行数:
wc -l test.txt
或者只计算字数:
wc -w test.txt
或者只计算比特数:
wc -c test.txt
在 ASCII 字符集中,比特数等于字符数。但对于非 ASCII 字符集,由于一些字符可能占用多个比特,字符的数目可能会不同(这在 Unicode 里有发生过)。
这种情况下使用 -m
参数可以得到正确的数目:
wc -m test.txt
Linux 中的 grep
命令
grep
命令是一个非常有用的工具。假若掌握了它,对日常的编码工作会有很大的帮助。
如果你比较好奇,
grep
的全写是 global regular expression print (全局正则表达式打印)。
你可以使用 grep
在文件中进行搜索,或者与管道符配合使用,将输出结果传递到其他命令。
例如,可以用以下命令在 index.md
文件里搜寻 document.getElementById
这一行出现的次数:
grep -n document.getElementById index.md
使用 -n
参数可以显示行号:
grep -n document.getElementById index.md
一个非常有用的方法是告诉 grep 在相应行的前后各输出 2 行,以提供更多的上下文。这可以用参数 -C
来完成,它可以受取其后的若干行数:
grep -nC 2 document.getElementById index.md
搜索默认是区分大小写的。使用参数 -i
可以使其不再区分。
如上所述,你可以使用 grep 来过滤其他命令的输出。我们可以使用以下方法重现前述的功能:
less index.md | grep -n document.getElementById
搜索字符串中可以使用正则表达式,这让 grep
变得非常强大。
另一个你可能发现很有用的方法是——使用参数 -v
反转结果,排除与特定字符串匹配的行:
Linux 中的 sort
命令
假定你有一份文本文件,里面包含一些狗狗的名字:
这串名字并没有进行排序。
而 sort
命令会帮你按照名称顺序排列它们:
使用 r
参数倒转排序结果:
默认情况下,排序区分大小写,并且遵循英文字母顺序。使用 --ignore-case
参数进行不区分大小写的排序,使用 -n
参数可按数值大小顺序进行排序。
如果文件包含重复的行:
你可以使用 -u
参数移除它们:
sort
命令不像多数 UNIX 命令那样,只是用于操作文件,它还可以与管道符配合使用。因此你可以将它用在其他命令的输出上。例如,你可以用它排序 ls
命令传回的文件列表:
ls | sort
sort
的功能非常强大,它还支持更多的参数,你可以输入 man sort
来探索:
Linux 中的 uniq
命令
uniq
命令可以帮助你排序文本文件中的行。
这些行可以通过文件获取,或用管道符从另一个命令的输出中得到:
uniq dogs.txt
ls | uniq
此处需要考虑一个关键点: uniq
只会检测相邻的重复行。
这意味着你可能会将它与 sort
配合使用:
sort dogs.txt | uniq
sort
命令拥有自己的参数—— -u
(unique) 来移除重复的行。但 uniq
更为强大。
默认情况下,它会删除重复的行:
你可以告诉它只是显示重复的行,例如,使用 -d
参数:
sort dogs.txt | uniq -d
还可以使用 -u
参数,那样就只会显示不重复的行:
使用 -c
参数计算每一行的出现次数:
使用以下的特殊命令组合:
sort dogs.txt | uniq -c | sort -nr
即可将文件内的行按最常见的频率排序:
Linux 中的 diff
命令
diff
是一个非常方便的命令。假定有两个文件,它们包含几乎相同的信息,你没有办法找出区别。
diff
会处理文件,然后告诉你有差异的地方。
假定有两个文件: dogs.txt
和 moredogs.txt
。它们的区别是: moredogs.txt
比前者多了一条狗狗的名字:
diff dogs.txt moredogs.txt
会告诉你后者多了一行,在第 3 行有 Vanille
这一行:
如果你改变两个文件的顺序,它会告诉你后者的第三行丢失了,也就是 Vanille
那一行:
使用 -y
参数会逐行对比两个文件:
你可能更熟悉 -u
参数,因为在 Git 版本管理系统中,它一样是用来显示不同版本文件差异的:
对于目录,比较的方式是一样的。你必须使用 -r
选项来进行递归比较(进入子目录):
如果你只对哪个文件存在差异感兴趣,而非关注文件的内容,可以使用 r
和 q
参数:
它还支持更多参数,你可以用 man 页面来探索,只需键入 man diff
:
Linux 中的 echo
命令
echo
命令会做一件简单的事情:它将传递给自身的参数打印输出。
以下示例:
echo “hello”
会将 hello
输出到终端。
我们可以将输出追加到文件中:
echo “hello” >> output.txt
我们可以对环境变量进行插值:
echo “The path variable is $PATH”
注意,特殊字符需要用反斜杠进行转义。以 $
为例:
这只是个开始。当与 Shell 功能交互时,我们可以用它来做一些很棒的事情。
我们可以输出当前文件夹中的文件:
echo *
我们还可以输出当前文件夹中所有以字母 o
开头的文件:
echo o*
任何有效的 Bash(或者是你使用的其他 Shell)命令和功能可以在此使用。
你可以输出你的主文件夹(home)的路径:
echo ~
你还可以执行命令,并且将执行结果打印到标准输出(或者是文件,正如你看到的):
echo $(ls -al)
注意,输出在默认情况下不保留空白。如需留白,必须用双引号来包裹命令:
你可以用它生成字符串列表,例如指定一个范围:
echo {1…5}
Linux 中的 chown
命令
在 Linux 或 macOS 操作系统(或是任一 UNIX 系统)中,每个文件或目录都有所有者。
所有者可以对文件做任何事情。它可以决定文件的命运。
使用 chown
命令,所有者(以及 root
用户)也可以将文件所有权转移给另一个用户:
chown <所有者> <文件>
像这样:
chown flavio test.txt
例如,假设有一个为 root
所拥有的文件,作为其他用户,你无法对它进行写入:
你可以使用 chown
将文件所有权转移到你:
一种需求十分常见:改变目录的所有权,同时遍历修改其中包含的文件、子目录以及子目录中的文件的所有权。
你可以使用 -R
参数来完成:
chown -R <所有者> <文件>
文件和目录不仅属于所有者,同时还属于用户组。使用以下命令,你可以在变更所有者的同时,更改其所属用户组:
chown <所有者>:<用户组> <文件>
举例:
chown flavio:users test.txt
你还可以使用 chgrp
命令,只更改文件的所属用户组:
chgrp <用户组> <文件名>
Linux 中的 chmod
命令
在 Linux 或 macOS 操作系统(或是任一 UNIX 系统)中,每个文件都有三种权限:读取、写入和执行。
进入一个文件夹,并运行 ls -al
命令。
你在文件列表每一行见到的,像是 drwxr-xr-x
这样的奇怪字符串,定义了文件或文件夹的权限。
让我们来剖析一下。
第一个字母表示文件的类型:
-
-
表示这是一个常规的文件 -
d
表示这是一个目录 -
l
表示这是一个链接
之后你就有了三组值:
-
第一组代表文件所有者拥有的权限
-
第二组代表文件所关联的用户组成员拥有的权限
-
第三组代表其他人拥有的权限
这些组由三个值组成。rwx
代表特定 角色 拥有读取、写入和执行访问权限。任何被移除的权限会被替换为 -
,因此你可以将不同的值,及其代表的相关权限进行组合:例如 rw-
、r--
、r-x
等等。
你可以使用 chmod
命令来改变一个文件的权限。
chmod
有两种用法。其一是使用符号参数,其二是使用数字参数。首先来试试更为直观的符号参数。
终端输入 chmod
,空格,之后加上一个字母:
-
a
表示 all,即全体 -
u
表示 user,即用户 -
g
表示 group,即用户组 -
o
表示 others,即其他人
然后输入 +
或 -
并加上一个或多个权限符号(r
、w
、x
),来添加或删除任意权限。
键入以上所有命令和参数之后,都要加上文件或文件夹名称。
以下是一些例子:
chmod a+r filename #每个人都可以读取
chmod a+rw filename #每个人都可以读取和写入
chmod o-rwx filename #其他人(非文件所有者,也不在文件所属用户组中的用户)无法读取、写入或执行文件
只需要在 +
/-
前添加多个字母,即可将相同的权限批量应用到不同的身份:
chmod og-r filename #其他人,和用户组无法读取文件。
如果你正在编辑一个文件夹,你可以使用 -r
(递归)参数将权限应用到该文件夹中的每个文件。
使用数字参数速度更快,但我认为当你不是每天都使用的话,是很难记住它们的。数字在此代表任一角色的权限。这个数字值最大可以是7,它是这样计算的:
-
拥有执行权限,记为
1
-
拥有写入权限,记为
2
-
拥有读取权限,记为
4
这又给我们带来四种组合:
-
0
代表无权限 -
1
代表可以执行 -
2
代表可以写入 -
3
代表可以写入和执行 -
4
代表可以读取 -
5
代表可以读取和执行 -
6
代表可以读取和写入 -
7
代表可以读取、执行和写入
我们使用三组数字,来同时设置所有 3 个用户身份的全部权限:
chmod 777 filename
chmod 755 filename
chmod 644 filename
Linux 中的 umask
命令
创建一个文件时,不需要事先决定权限。权限有默认值。
这些默认值可以使用 umask
命令来控制和修改。
不带参数输入 umask
,它会显示当前的 umask 值,本例中为 0022
:
0022
是什么意思? 这是一个代表权限的八进制数值。
另一个常见的数值是 0002
.
使用 umask -S
查看更具可读性的注释:
在这里,用户(u
),也就是文件的所有者,拥有对文件的读取、写入和执行的权限。
和所有者位于同一用户组的用户(g
)拥有对文件的读取和执行权限,除此之外的其他用户(o
)也一样。
在数字符号中,我们通常会改变最后3位数字。
以下列表给出了这些数字的含义:
-
0
代表读取、写入与执行 -
1
代表读取与写入 -
2
代表读取与执行 -
3
代表只读 -
4
代表写入与执行 -
5
代表仅写入 -
6
代表仅执行 -
7
代表没有权限
注意,这里的数字含义与前述 chmod
命令中用到的并不同。
可以用数值格式,为权限掩码设置一个新的值:
umask 002
也可以更改特定角色的权限:
umask g+r
Linux 中的 du
命令
du
命令会计算整个目录的大小:
du
这里的 32
是一个单位为字节(Byte)的值。
运行 du *
会单独计算每个文件的大小:
你也可以执行 du -m
或 du -g
,以兆字节(MB)或千兆字节(GB)为单位显示文件大小。
使用 -h
选项,会显示更为可读的,适应大小的数值:
添加 -a
选项同样会输出文件夹中每一个文件的大小:
一个方便的做法是按大小对目录进行排序:
du -h | sort -nr
然后通过管道输出到 head
,从而仅获取前 10 个结果:
Linux 中的 df
命令
df
命令用来获取磁盘的使用情况信息。
它的基础形式会输出当前挂载的磁盘卷信息:
使用 -h
参数 (df -h
)会将值以更为可读的方式显示:
你也可以指定任一文件或目录名,以获取其所在的特定卷的信息:
Linux 中的 basename
命令
假设有一个文件路径,比如 /Users/flavio/test.txt
。
执行
basename /Users/flavio/test.txt
会返回 text.txt
字符串:
如果你在任一指向目录的路径字符串上执行 basename
,你会得到路径的最后一节。在以下例子中,/Users/flavio
是一个目录:
Linux 中的 dirname
命令
假设有一个文件路径,比如 /Users/flavio/test.txt
。
执行
dirname /Users/flavio/test.txt
会返回 /Users/flavio
字符串:
Linux 中的 ps
命令
电脑每时每刻都在运行大量不同的进程。
你可以用 ps
命令检查它们:
这是当前会话中运行的,由用户发起的进程列表。
此处我打开了一些 fish
Shell 实例,大多数是在 VS Code 编辑器内部启动的,还运行了一个 Hugo 实例,用来生成网站的开发预览。
这些只是分配给当前用户的命令。要列出所有进程,我们需要给 ps
传递一些参数。
我最常使用的命令是 ps ax
:
a
参数用来同时列出其他用户的进程。x
显示那些未与终端相连的进程(不是由用户通过终端发起的)。
如你所见,较长的命令被截断了。使用 ps axww
继续在新的行上列出命令,而非截断。
我们需要输入
w
两次来应用这个设置(这不是笔误)。
你可以配合使用 grep
和管道符来搜索特定的进程,比如像这样:
ps axww | grep “Visual Studio Code”
ps
返回的列表达了一些重要信息。
第一个信息是 PID
,也就是进程 ID。当你想在另一个命令中引用这个进程时,比如说要杀死它,这是关键的。
然后是 TT
,它告诉我们进程所使用的终端 ID。
接下来 STAT
告诉我们进程的状态:
I
代表闲置的进程(睡眠时间超过约 20 秒)
R
代表可运行的进程
S
代表睡眠时间少于 20 秒的进程
T
代表已停止的进程
U
代表处于不间断等待中的进程
Z
代表已死亡的进程(zombie,即僵尸进程)
如果出现一个以上的字母,那么第二个字母代表进一步的、可能非常有技术性的信息。
常见的是 +
,它代表相应进程在终端中处于前台。而 s
代表相应进程是一个 会话领头进程(session leader).
TIME
则告诉我们进程已经运行了多长时间。
Linux 中的 top
命令
top
命令用来显示系统中正在运行的进程的动态实时信息。
如果要了解系统发生了什么,这条命令真的很方便。
它的用法很简单。你只需要输入 top
,终端会完全沉浸到新的视图中:
这个进程是持续运行的。要退出,你可以输入字母 q
或按下 ctrl-C
。
它给出了很多信息:进程数量、有多少进程在运行或休眠、系统负载、CPU 使用率,还有更多信息。
在下方,占用 CPU 和内存资源最多的进程列表不断刷新。
默认情况下,进程按 CPU 使用率排列,正如你在高亮标记的 %CPU
列中看到的那样。
你可以添加一个参数,要求进程列表按内存利用率排列:
top -o mem
Linux 中的 kill
命令
Linux 进程可以接收信号并做出反应。
这是我们与运行中进程打交道的一种方式。
kill
程序可以向任一程序发送多种信号。
虽然这个命令的名字暗示了它的主要功能,但它不只是用来终止程序的。
它的用法是:
kill
默认情况下,它会向指定的进程 ID 发送 TERM
信号。
我们可以使用参数来发送其它信号,包括以下这些:
kill -HUP
kill -INT
kill -KILL
kill -TERM
kill -CONT
kill -STOP
HUP
代表 hang up(挂起)。 如果在终止进程之前,先关闭了启动它的终端窗口,这一信号将被自动发送。
INT
代表 interrupt(干扰),这个信号和在终端中按下 ctrl-C
组合键的作用一样,常常用来终结进程。
KILL
信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止并终结。
TERM
代表 terminate(终结)。这是本命令的默认信号,进程收到它会自主终结。
CONT
代表 continue(继续)。它可以用来恢复一个被停止的进程。
STOP
信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止(但不终结)。
有时你也会见到用数字表示状态的情况,例如 kill -1 <PID>
。在这种情况下,
1
对应 HUP
2
对应 INT
9
对应 KILL
15
对应 TERM
18
对应 CONT
15
对应 STOP
Linux 中的 killall
命令
与 kill
命令类似, killall
也向进程发送状态信号,但区别是后者可以同时向多个进程发送信号,而非前者只能向单个进程 ID 发送信号。
这是它的命令语法:
killall
name
也就是进程的名字。例如,假设有多个 top
程序的实例在运行, killall top
命令将完全终结它们。
你可以指定某一个信号,就像使用 kill
命令那样(请向上翻阅 kill
命令的指南以了解更多具体可以发送的信号),例如:
killall -HUP top
Linux 中的 jobs
命令
当我们在 Linux / macOS 中运行命令时,我们可以在末尾加入 &
符号,使其在后台运行。
例如,让 top
命令在后台运行:
top &
这对于需要长时间运行的程序来说很方便。
要返回切入后台的程序,可以使用 fg
命令。如果后台只有一个作业进程,那么直接使用就好;否则要在后面加上作业进程的号码,如: fg 1
、fg 2
,以此类推。
要获取作业进程号,我们可以使用 jobs
命令。
假设我们运行了 top &
,之后再运行 top -o mem &
,因而我们有两个 top 实例在运行。此时 jobs
命令会这样告诉我们:
现在我们可以利用 fg <作业号>
切回任意一个实例。要再次终止程序,可以按下 cmd-Z
。
运行 jobs -l
也会列出每一个作业的进程 ID。
Linux 中的 bg
命令
当命令执行时,你可以按下 ctrl-Z
暂停它。
按下后,命令会即刻停止,并将你带回到 Shell 终端。
你可以恢复命令在后台的执行,这样既可以使命令保持运行,同时又不会妨碍你在终端中做其他工作。
在这一例子中,有 2 个命令停止了:
运行 bg 1
即可在后台恢复作业 #1 的执行。
我也可以不带任何参数执行 bg
命令,它会默认选取作业列表中的 #1 项。
Linux 中的 fg
命令
当命令在后台运行时,由于此前你已经在命令末尾加上了 &
(例如 top &
,或是使用了 bg
命令将命令放到后台),此时你可以用 fg
命令将其切换回前台。
执行
fg
它将在前台恢复最后被暂停的作业。
你也可以加上作业号,即可指定任一你想在前台恢复的作业,作业号可以使用 jobs
命令获得。
执行 fg 2
将恢复作业 #2:
Linux 中的 type
命令
命令可分为以下四种类型:
-
可执行程序
-
Shell 内置程序
-
Shell 功能
-
命令别名
如果你很想知道或只是很好奇,type
命令可以帮你分清这些。它会告诉你某一命令如何被解析。
输出根据 Shell 的类型而有所不同,这是在 Bash 中的样子:
这是在 Zsh 中的样子:
这是在 Fish 中的样子:
其中一个有趣的现象是:对于别名,它会告诉你某个别名将被解析到何处。例如,在 Bash 和 Zsh 中, ll
显示为一个别名,而在 Fish 中,由于 ll
是默认提供的,所以它会告诉你这是内置的 Shell 功能。
Linux 中的 which
命令
假定你有一个可直接执行的命令,因为它处在 Shell 路径中,但你想知道它的具体位置。
你可以用 which
来做这件事。这个命令会返回指定命令的路径。
which
只对存储在磁盘上的可执行文件起作用,对别名或内置 Shell 功能无效。
Linux 中的 nohup
命令
有时你必须在远程机器上运行一个长时间活跃的进程,但之后你需要断开连接。
或者,你只是想防止当本地和服务器之间有任何网络问题时,命令被停止执行。
要让任一命令在登出或关闭服务器会话后继续运行,可以使用 nohup
命令。
执行 nohup <命令>
可以让某个进程在你登出后继续工作。
Linux 中的 xargs
命令
在 UNIX Shell 中,xargs
命令用来将标准输入的数据转换成命令的参数。
换句话说,使用 xargs
,可以将一条命令的输出,用作另一条命令的输入。
下面是你将会用到的语法:
command1 | xargs command2
我们使用管道符(|
)将输出传递给 xargs
。它将负责运行 command2
命令,使用 command1
的输出作为参数。
我们来做个简单的例子。假设你要删除某个目录下的一些特定文件。这些文件列在一个文本文件中。
我们有三个文件: file1
、 file2
、 file3
。
在 todelete.txt
中,我们有一份想要删除的文件列表,在这一例子中是 file1
和 file3
:
我们将通过 xargs
把 cat todelete.txt
的输出引向 rm
命令。
就像这样:
cat todelete.txt | xargs rm
以下是执行结果,我们列出的文件现在已经被删除:
它的工作方式是:xargs
会运行 rm
2次,为 cat
返回的每一行运行一次。
这是 xargs
最简单的用法。我们还可以使用以下的一些参数。
在我看来,其中最有用的是 -p
(特别是刚开始学习 xargs
时)。使用这个选项将使 xargs
打印出一个确认提示,说明它要采取的行动:
-n
选项令 xargs
每次执行若干个迭代,因此你可以用 -p
单独确认它们。这里我们用 -n1
告诉 xargs
一次执行一个迭代:
另一个广泛应用的参数是 -I
。它可以将输出内容放入占位符,之后你可以用来做各种事。
其中一件事是同时运行多个命令,例如:
command1 | xargs -I % /bin/bash -c ‘command2 %; command3 %’
你可以将上方的
%
符号换成其他任何东西——它只是个变量。
Linux 中的 vim
编辑器命令
vim
是一个非常流行的文件编辑器,特别是在程序员中。 它被积极开发且经常更新,且有巨大的社区力量围绕着。甚至还有一个 Vim 会议!
在现代系统中,vi
只是 vim
的一个别名,意思是“改进的 vi
”(即 “vi
im
proved”)。
你可以在命令行运行 vi
启动它。
调用时指定一个文件名,你就可以编辑对应的文件:
vi test.txt
你需要了解的是,Vim 有两个主要的模式:
-
命令(command) 模式,也称为 普通(normal) 模式
-
插入(insert) 模式
当你启动编辑器时,默认处于命令模式。这时你无法像期望的那样,在基于图形界面的编辑器中输入文本。你需要进入插入模式。
可以按下 i
键进入插入模式。当你这样做之后, 在编辑器下方会出现 -- 插入 --
(或 INSERT)字样:
现在你可以开始输入了,用文件内容来填充终端屏幕:
你可以用方向键在文件中移动光标,或者使用 h
- j
- k
- l
四个键。 h-l
代表左和右,j-k
代表上和下。
当完成编辑时,按下 esc
键即可退出插入模式,回到命令模式。
此时你可以浏览文件,但无法向其添加内容(要注意按下了哪个键,某些键可能是编辑器的命令)。
现在你可能想知道如何保存文件。可以按下 :
(冒号),然后输入 w
,即 :w
要保存并退出,可以按下 :
然后输入 w
和 q
,即 :wq
要退出但不保存文件,可以按下 :
然后输入 q
和 !
,即 :q!
要撤销某一个更改并再次编辑,可以在命令模式中按下 u
。 如果要重做 (取消上次的撤销操作),可以按下 ctrl-r
。
以上是使用 Vim 工作的基本操作。接下来是一个无底洞,这篇简短的介绍是无法讲完的。
下面我只会提到那些能让你入门 Vim 编辑的命令:
-
按下
x
键,删除当前光标高亮的字符 -
按下
A
跳转到当前选择行的末尾 -
按下
0
跳转到行的开头 -
定位到任一单词的首字母,按下
d
,然后按w
即可删除相应单词。如果输入e
而非w
,后一个单词前的空白处将被保留 -
在
d
和w
之间加入一个数字,即可删除多个单词,例如使用d3w
来向前删除 3 个单词 -
按下
d
然后再按一次d
,即可删除整行。按下d
然后再按$
,即可删除以光标为开头,直至当前行末尾的整行内容。
如需了解更多 Vim 的内容,我推荐参阅 Vim 常见问题。你还可以运行 vimtutor
命令,它应该已经安装到系统中,可以对你开始探索 vim
有很大帮助。
Linux 中的 emacs
编辑器命令
emacs
是一个很棒的编辑器,它在历史上被认作是专为 UNIX 系统而生的。更著名的是:围绕 vi
与 emacs
之间的火热纷争与激烈论战曾给全世界的开发者带来许多无益的时光。
emacs
非常强大。一些人将其当作一种操作系统,全天候都在使用它 (https://news.ycombinator.com/item?id=19127258)。我们在此处只谈及一些基础的用法。
你可以调用 emacs
来开启新的 emacs 会话:
macOS 用户们,现在请停一下。如果你当前在使用 Linux,那就没有什么问题,但 macOS 并未搭载使用 GPLv3 协议的应用程序,且每个内置的 UNIX 命令也没有更新到 GPLv3 版本。
虽然这对于我以上已经列出的命令来说,只是个小问题,但就本例而言,使用 2007 年的 emacs 版本与使用经过十余年改进和变化的版本,体验并不完全相同。
对于时常更新的 Vim 来说,这也不算什么。但想要解决 emacs 的问题,你需要运行 brew install emacs
,之后再运行 emacs
,即可使用 Homebrew 提供的新版本(确保 Homebrew 已安装)。
与 Vim 类似,你也可以调用 emacs <文件名>
来编辑已有的文件:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
Spring Cloud实战
Spring Boot实战
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
插入模式。
可以按下 i
键进入插入模式。当你这样做之后, 在编辑器下方会出现 -- 插入 --
(或 INSERT)字样:
现在你可以开始输入了,用文件内容来填充终端屏幕:
你可以用方向键在文件中移动光标,或者使用 h
- j
- k
- l
四个键。 h-l
代表左和右,j-k
代表上和下。
当完成编辑时,按下 esc
键即可退出插入模式,回到命令模式。
此时你可以浏览文件,但无法向其添加内容(要注意按下了哪个键,某些键可能是编辑器的命令)。
现在你可能想知道如何保存文件。可以按下 :
(冒号),然后输入 w
,即 :w
要保存并退出,可以按下 :
然后输入 w
和 q
,即 :wq
要退出但不保存文件,可以按下 :
然后输入 q
和 !
,即 :q!
要撤销某一个更改并再次编辑,可以在命令模式中按下 u
。 如果要重做 (取消上次的撤销操作),可以按下 ctrl-r
。
以上是使用 Vim 工作的基本操作。接下来是一个无底洞,这篇简短的介绍是无法讲完的。
下面我只会提到那些能让你入门 Vim 编辑的命令:
-
按下
x
键,删除当前光标高亮的字符 -
按下
A
跳转到当前选择行的末尾 -
按下
0
跳转到行的开头 -
定位到任一单词的首字母,按下
d
,然后按w
即可删除相应单词。如果输入e
而非w
,后一个单词前的空白处将被保留 -
在
d
和w
之间加入一个数字,即可删除多个单词,例如使用d3w
来向前删除 3 个单词 -
按下
d
然后再按一次d
,即可删除整行。按下d
然后再按$
,即可删除以光标为开头,直至当前行末尾的整行内容。
如需了解更多 Vim 的内容,我推荐参阅 Vim 常见问题。你还可以运行 vimtutor
命令,它应该已经安装到系统中,可以对你开始探索 vim
有很大帮助。
Linux 中的 emacs
编辑器命令
emacs
是一个很棒的编辑器,它在历史上被认作是专为 UNIX 系统而生的。更著名的是:围绕 vi
与 emacs
之间的火热纷争与激烈论战曾给全世界的开发者带来许多无益的时光。
emacs
非常强大。一些人将其当作一种操作系统,全天候都在使用它 (https://news.ycombinator.com/item?id=19127258)。我们在此处只谈及一些基础的用法。
你可以调用 emacs
来开启新的 emacs 会话:
macOS 用户们,现在请停一下。如果你当前在使用 Linux,那就没有什么问题,但 macOS 并未搭载使用 GPLv3 协议的应用程序,且每个内置的 UNIX 命令也没有更新到 GPLv3 版本。
虽然这对于我以上已经列出的命令来说,只是个小问题,但就本例而言,使用 2007 年的 emacs 版本与使用经过十余年改进和变化的版本,体验并不完全相同。
对于时常更新的 Vim 来说,这也不算什么。但想要解决 emacs 的问题,你需要运行 brew install emacs
,之后再运行 emacs
,即可使用 Homebrew 提供的新版本(确保 Homebrew 已安装)。
与 Vim 类似,你也可以调用 emacs <文件名>
来编辑已有的文件:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-frMrNdWz-1713443424139)]
[外链图片转存中…(img-B7U4t66m-1713443424141)]
[外链图片转存中…(img-Nxp7qZd6-1713443424141)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
[外链图片转存中…(img-QqFDalJU-1713443424142)]
Spring Cloud实战
[外链图片转存中…(img-r7Fm4wnH-1713443424142)]
Spring Boot实战
[外链图片转存中…(img-FESz3pEs-1713443424143)]
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!