UNIX文件系统命令指南

286 阅读15分钟

我写这本手册的目的是让大家轻松地学习、记忆和参考主要的UNIX文件系统实用程序。从实际情况来看,macOS和GNU/Linux都是UNIX系统。macOS是一个认证的UNIX,基于BSD UNIX,而GNU/Linux是类似UNIX的,或者说是UNIX的衍生品。

在介绍了文件系统和它的工作原理之后,我将介绍以下命令的细节。

与文件夹和文件一起工作

  • mkdir
  • cd
  • pwd
  • rmdir
  • ls
  • touch
  • mv
  • cp
  • ln

权限

  • chmod
  • chown
  • chgrp

文件内容

  • cat
  • less
  • find
  • cpio
  • dd
  • wc

文件系统是如何工作的

每一个现代计算机系统都依赖于一个文件系统来存储和检索程序。不是所有的东西都能保存在内存中,内存是一种珍贵而有限的资源,我们需要一个安全的地方,在计算机重新启动或关闭时存储数据。 在计算机重新启动时,内存被完全清除,而磁盘结构是持久的。

在本指南中,我特别研究了UNIX文件系统,它可以在macOS和GNU/Linux机器上找到。Windows的文件系统是不同的,尽管安装了WindowsSubsystem for Linux的Windows10允许你使用我在这里描述的相同工具。

一个文件系统从/ 。这是根节点,它承载着第一层的目录。

在UNIX系统中,你会发现通常的目录有

  • /bin 包含主要的系统命令
  • /etc 包含系统配置
  • /dev 包含系统设备
  • /usr 包含用户文件
  • /tmp 包含临时文件

......还有更多,但你会明白的。

有多少个取决于所使用的系统类型。Linux已经通过其Linux标准基础工作对文件夹进行了标准化,你通常有。

  • /bin 主要的系统命令
  • /boot 用于启动机器的文件(在MacOS上不存在)。
  • /dev 系统设备
  • /etc 系统配置文件
  • /etc/opt 用户程序配置文件
  • /home 用户的主目录(macOS的/Users)。
  • /lib 系统库(在macOS上不存在)。
  • /mnt 挂载的文件系统
  • /opt 用户程序
  • /proc 用户的内核和进程(在macOS上不存在)
  • /root 根用户的主文件夹(在macOS上不存在)
  • /run (在macOS上不存在)
  • /sbin 系统二进制文件 用于启动系统的用户
  • /tmp 临时文件
  • /usr 保存用户软件、库和工具
  • /usr/bin 用户二进制文件
  • /usr/include 用户头文件
  • /usr/lib 用户库
  • /usr/local 用户软件用来存储安装文件,如macOS上的Homebrew。
  • /usr/sbin 系统二进制文件
  • /usr/share 包含与架构无关的数据。它可以容纳很多杂七杂八的东西,包括文档和手册页
  • /usr/src 包含已安装软件包的源代码(在macOS中不存在)。
  • /var 包含临时文件、日志和更多

macOS有各种不同的文件夹,包括

  • /Applications 存储用户的应用程序
  • /Library 保存系统用户在全球使用的库(设置和资源)。
  • /System 保存系统文件
  • /private 保存系统文件、日志和更多

每个文件夹都包含文件和目录,而这些文件和目录又可以包含其他文件和目录,以此类推。

所有文件和文件夹都有一个名称。

什么是一个有效的名字?它可以是1到255个字符的长度,而且必须由任何字母数字字符(a-z/A-Z/0-9)、下划线字符(_)、点(.)和逗号(,)字符组成。

你也可以使用空格,但一般不建议使用,因为每次你必须引用文件/文件夹时,都需要用反斜杠来转义空格。

根据系统的不同,文件系统可以区分大小写。在macOS上,文件系统默认区分大小写,所以你不可能有一个名为test 的文件/文件夹和另一个名为Test 。它们是同一件事。

现在,我将介绍各种实用程序命令。这些命令是在Shell的背景下执行的,比如Bash、Fish或Zsh。当你启动shell时,你将会在你的主目录中。在macOS中,这是在/Users/<yourname>/ 路径中找到的。

如果你改变你使用的shell,这些命令不会改变,因为这些是UNIX的基本命令。你可能会使用这些命令几十年,除非计算世界发生一些革命(它们会发生,但这些服务器端的东西通常进展缓慢)。为了给你一些启示,你现在看到的mkdir 命令是在80年代初的UNIX AT&T版本1中引入的。

与文件夹和文件一起工作

mkdir

你使用mkdir 命令来创建文件夹。

你可以用一个命令创建多个文件夹。

你还可以通过添加-p 选项来创建多个嵌套文件夹。

UNIX命令中的选项通常采用这种形式。你在命令名称后面添加它们,它们就会改变命令的行为方式。你通常也可以结合多个选项。

你可以通过输入man <commandname> 找到一个命令支持哪些选项。例如,现在就用man mkdir (按q 键来护送手册页)。手册页是UNIX惊人的内置帮助。

cd

一旦你创建了一个文件夹,你就可以使用cd 命令进入该文件夹。cd 意思是改变 目录。你调用它,指定一个要移动到的文件夹。你可以指定一个文件夹名称,或整个路径。

例子。

现在你进入了fruits 文件夹。

你可以使用.. 特别路径来指示父文件夹。

cd .. #back to the home folder

#字符表示注释的开始,它在找到后持续整行。

你可以用它来组成一个路径。

mkdir fruits
mkdir cars
cd fruits
cd ../cars

还有一个特殊的路径指示器,它是. ,表示当前的文件夹。

你也可以使用绝对路径,它从根文件夹开始/

pwd

每当你在文件系统中感到迷失时,可以调用pwd 命令来知道你在哪里。

它将打印出当前的文件夹路径。

rmdir

就像你可以用mkdir 创建一个文件夹一样,你可以用rmdir 删除一个文件夹。

mkdir fruits
rmdir fruits

你也可以一次删除多个文件夹。

mkdir fruits cars
rmdir fruits cars

你所删除的文件夹必须是空的。

要删除带有文件的文件夹,我们将使用更通用的rm 命令,它可以删除文件和文件夹,使用-rf 选项。

请注意,这个命令不要求确认,它将立即删除你要求它删除的任何东西。

从命令行中删除文件时,没有bin,而且恢复丢失的文件也很困难。

ls

在一个文件夹内,你可以使用ls 命令列出该文件夹包含的所有文件。

如果你添加一个文件夹名称或路径,它将打印该文件夹内容。

ls 接受了很多选项。我最喜欢的一个选项组合是 。试试吧。-al

与普通的ls 相比,它返回的信息要多得多。

你有,从左到右。

  • 文件权限(如果你的系统支持ACL,你还会得到一个ACL标志)
  • 该文件的链接数
  • 该文件的所有者
  • 该文件的组别
  • 以字节为单位的文件大小
  • 文件的修改日期
  • 文件名称

这组数据是由l 选项生成的。而a 选项也显示了隐藏的文件。

隐藏文件是以点开头的文件(.)。

touch

你可以使用touch 命令创建一个空文件。

如果该文件已经存在,它会以写模式打开该文件,并更新该文件的时间戳。

mv

一旦你有了一个文件,你可以使用mv 命令来移动它。你指定文件的当前路径和它的新路径。

touch test
mv pear new_pear

pear 文件现在被移到new_pear 。这就是你重命名文件和文件夹的方法。

如果最后一个参数是一个文件夹,位于第一个参数路径的文件将被移到该文件夹中。在这种情况下,你可以指定一个文件列表,它们将全部被移到最后一个参数确定的文件夹路径中。

touch pear
touch apple
mkdir fruits
mv pear apple fruits #pear and apple moved to the fruits folder

cp

你可以使用cp 命令复制一个文件。

touch test
cp apple another_apple

要复制文件夹,你需要添加-r 选项来递归地复制整个文件夹的内容。

mkdir fruits
cp -r fruits cars

ln

现在我们来介绍一下链接的概念。链接是指一个指向另一个文件的文件。我们在所有主要的操作系统中都有这些链接。

我们可以创建两种类型的链接:硬链接和符号(软)链接。我们不能创建一个目录的硬链接,但我们可以创建一个象征性的链接。由于这个原因,符号链接(也称为符号链接)更为常见。

我们使用这种语法来创建一个符号链接。ln -s original linkname.例子。

mkdir fruits
ln -s fruits newfruits

注意我是如何使用ll 命令的。这不是一个标准的命令,而是ls -al 的一个别名。在shell中,你可以定义别名,作为常用命令和参数组合的快捷方式。

权限

我之前在介绍ls -al 命令时简要地提到了权限。

你在每个文件行看到的奇怪的字符串,如drwxr-xr-x ,定义了文件或文件夹的权限。

让我们来剖析一下它。

第一个字母表示文件的类型。

  • - 表示它是一个普通文件
  • d 表示它是一个目录
  • l 意味着它是一个链接

然后你有3组数值。

  • 第一组代表该文件所有者的权限
  • 第二组代表该文件所属的成员的权限
  • 第三组代表其他所有人的权限。

这些集合由3个值组成。rwx ,意味着特定的人物有读、写和执行的权限。任何被删除的东西都会被换成- ,这让你形成各种数值和相对权限的组合。rw-,r--,r-x, 等等。

你可以使用chmod 命令来改变一个文件的权限。

chmod 可以用2种方式使用。第一种是使用符号参数,第二种是使用数字参数。让我们先从符号开始,这更直观。

你输入chmod ,后面是一个空格和一个字母。

  • a 代表所有
  • u 代表用户
  • g 代表
  • o 代表其他

然后你输入+- 来增加一个权限,或删除它。然后你输入一个或多个权限符号 (r,w,x)。

后面都是文件或文件夹的名称。

这里有一些例子。

chmod a+r filename #everyone can now read
chmod a+rw filename #everyone can now read and write
chmod o-rwx filename #others (not the owner, not in the same group of the file) cannot read, write or execute the file

你可以通过在+/- 前面添加多个字母来对多个角色应用相同的权限。

chmod og-r filename #other and group can't read any more

如果你正在编辑一个文件夹,你可以使用-r (递归)标志将权限应用于该文件夹中的每个文件。

数字参数更快,但我发现当你不是每天都在使用它们时很难记住它们。你使用一个数字,代表角色的权限。这个数字值最多可以是7,它的计算方法是这样的。

  • 1 如果有执行权限
  • 2 如果有写入权限
  • 4 如果有阅读权限

这就给了我们4种组合。

  • 0 没有权限
  • 1 可以执行
  • 2 可以写
  • 3 可以写,可以执行
  • 4 可以读
  • 5 能读,能执行
  • 6 能读、能写
  • 7 可以读、写和执行

我们以3人一组的方式使用它们,来设置所有3个组的权限。

chmod 777 filename
chmod 755 filename
chmod 644 filename

所有者和组

你可以使用chown 命令来改变一个文件的所有者。

chown <username> <filename>

你可以使用chgrp 命令来改变一个文件的组。

管理文件内容

less

less 命令是我经常使用的一个命令。它可以在一个漂亮的交互式用户界面中显示存储在文件中的内容。

使用方法。less <filename>.

一旦你进入了less 会话,你可以按q 退出。

你可以用updown 键来浏览文件内容,或者用space barb 来逐页浏览。你还可以按G 跳到文件的末尾,按g 跳回开头。

你可以在文件中搜索内容,方法是按/ ,然后输入一个要搜索的词。这样可以向前搜索。你可以使用? 符号并输入一个词来向后搜索。

这个命令只是将文件的内容可视化。你可以按v ,直接打开一个编辑器。它将使用系统编辑器,在大多数情况下,它是vim

F 键进入跟随模式,或观察模式。当文件被其他人修改时,比如从另一个程序中,你就可以看到现场的修改。默认情况下,这不会发生,你只能看到你打开文件时的版本。你需要按ctrl-C 来退出这个模式。在这种情况下,行为类似于运行tail -f <filename> 命令。

你可以打开多个文件,并使用:n (转到下一个文件)和:p (转到上一个文件)来浏览它们。

tail

我刚刚在前面的命令中提到了tail ,所以让我们利用这个机会来解释它的作用。

在我看来,它最好的使用情况是与-f 选项一起调用。它在最后打开文件,并观察文件的变化。只要文件中有新的内容,它就会被打印在窗口中。例如,这对于观察日志文件是非常好的。

tail -f /var/log/system.log

要退出,按ctrl-C

你可以打印文件中的最后10行。

你可以打印整个文件的内容,从某一行开始,在行号前使用+

tail 还可以做更多的事情,我的建议是查看 。man tail

cat

tail 在某种程度上类似,我们有cat 。除了cat ,还可以向文件添加内容,这使它变得超级强大。

在其最简单的用法中,cat 将一个文件的内容打印到标准输出。

你可以打印多个文件的内容。

并使用输出重定向操作符> ,你可以将多个文件的内容串联到一个新文件中。

使用>> ,你可以将多个文件的内容追加到一个新的文件中,如果不存在,就创建它。

当观察源代码文件时,能看到行号是很好的,你可以使用-n 选项让cat 打印它们。

你可以使用-b ,只给非空行添加数字,或者你也可以使用-s ,删除所有的多个空行。

cat 经常与管道操作符 结合使用,将一个文件内容作为输入送入另一个命令。.| cat file1 | anothercommand

wc

wc 表示字数。这里是最常见的用法。

  • wc -l file1 计算行数
  • wc -w file1 计算字数
  • wc -c file1 计算字符
  • wc -m file1 计算支持多字节的字符(即表情符号算作1,而不是多个字符)。

你可以运行wc ,提供多个文件,在这种情况下,它将对每个文件分别进行计算,然后打印一个摘要。

find

find 命令可用于查找与特定搜索模式相匹配的文件或文件夹。它的搜索是递归的。

让我们通过实例来学习它。

找到当前树下所有扩展名为.js 的文件,并打印每个匹配文件的相对路径。

重要的是在特殊字符(如* )周围使用引号,以避免shell对其进行解释。

查找当前树下与 "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天前编辑的文件

搜索过去24小时内编辑过的文件

你可以通过添加-delete 选项来删除所有符合搜索的文件。这将删除所有在过去24小时内编辑过的文件。

find . -type f -mtime -1 -delete

你可以对搜索的每个结果执行一个命令。在这个例子中,我们运行cat 来打印文件内容。

find . -type f -exec cat {} \;

注意到结束语\;{} ,在执行时填写了文件名。