千家信息网

UNIX命令行惯用语有哪些

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章给大家分享的是有关UNIX命令行惯用语有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。开始学习之旅在以前的对话 UNIX 专栏中曾多次介绍了 find 命令,这
千家信息网最后更新 2025年12月02日UNIX命令行惯用语有哪些

这篇文章给大家分享的是有关UNIX命令行惯用语有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

开始学习之旅

在以前的对话 UNIX 专栏中曾多次介绍了 find 命令,这是一种非常有用的实用工具,可用于扫描并处理各种文件,甚至整个 UNIX 文件系统。例如,我经常将 find 与 grep 或者 Perl 一起使用,以便对大量的文件进行处理。您需要了解在一大段代码中的何处定义了变量或常量吗?可以尝试下面的命令:

代码如下:


$ find /path/to/src -type f | xargs grep -H -I -i -n string

该命令的输出是一个文件名列表,其中包含 string,包括行编号和匹配的特定文本。在每个匹配的文件名和行编号的前面分别加上了 -H 和 -n 选项。-i 选项忽略大小写。-I(大写"I")跳过二进制文件。

您以前可能没有见过 xargs,它将使用列出的所有选项运行您所指定的命令,在本示例中是 grep,每次使用通过标准输入提供的一个参数。假设 /path/to/src 目录包含文件 a、b 和 c,使用 find 与 xargs 等价于:

代码如下:


grep -H -I -i -n string a
grep -H -I -i -n string b
grep -H -I -i -n string c

事实上,搜索文件集是一项常见的工作,所以 grep 具有相应的选项以递归遍历整个文件系统层次结构。可以使用 -d recurse 或其同义词 -R 或者 -r。例如,可以使用:

代码如下:


$ grep -H -I -i -n -R string/path/to/src

这个命令与 find/xargs 完成相同的任务。(您将发现,许多与文件相关的 UNIX 实用工具都具有递归选项。ls -R 可以递归地列出层次结构中的内容。chmod、chgrp 和 chown 使用 -R 可以递归地将模式、组和所有权变更应用到整个文件系统层次结构。在使用 chmod -R 时,请多加小心。如果删除了目录的执行位,比如 chmod -R a-x,您可能会使得一个目录变得不可使用。为了更具选择性,可以使用 find . -type f | xargs chmod a-x。)

那么,什么时候应该使用 find/xargs,什么时候应该使用 grep 呢?当需要具有一定的选择性时,可以使用 find。find 命令具有许多选项,使得您可以选择满足特定要求的文件,如"所有在午夜后修改过的、并由 Joe 拥有的常规文件"。否则,使用 grep -R 就可以了。

另一种实用工具可能比 find 使用起来更加方便,并且速度更快。如果您打算根据名称来查找一个文件,那么可以尝试使用 locate 来代替 find -name。locate 命令周期性地(大约每天一次,由系统管理员设置)为系统中所有的文件编制目录,并构建一个由路径和文件名组成的数据库。当您运行 locate 时,它将扫描其私有的数据库,尝试进行匹配。

例如,运行查询 locate '*.1',将得到名称以 .1 结尾的所有文件和目录。(前面的星号表示匹配任何字符串。)为了方便起见,运行 locate fish 命令与运行 locate '*fish*' 是相同的。

货币替换

有许多 UNIX 实用工具可以对文件进行修改。在大多数情况下,可以将经过修改的内容发送到标准输出,您可以使用重定向操作符对其进行进一步的处理(使用管道"|")或捕获其中的结果(使用 > 或 >> 操作符)。

其他的实用工具(那些通常可以一次处理许多文件的工具)可以出于安全考虑而保留原始文件,并为修改后的内容生成一个新的文件。例如,您可以直接在命令行中使用 Perl 对文件进行处理。以下命令:

代码如下:


$ perl -i.bak -pe 's/\bdollar(s?)/buck\1/g' file.txt

将"dollar"替换为"buck",将"dollars"替换为"bucks"。perl -i 命令在原地对 file.txt 进行修改,而 perl -i.bak 则为原始文件建立一个副本,并在其名称后面添加 .bak,以区别于新的、经过修改的版本。因此,如下的命令:

代码如下:


perl -i.bak -pe 's/\bdollar(s?)/buck\1/g' *

将为当前目录中每个文件创建一个备份。假设有文件 file1.txt、file2.txt 和 file3.txt,那么您将得到 file1.txt.bak、file2.txt.bak 和 file3.txt.bak。错误操作时常发生,所以建立备份是明智之举。

如果出现了错误,并且必须恢复原始文件,您只需输入:

代码如下:


mv file1.txt.bak file1.txt

。但是,如果有数百个文件 需要进行重命名,那又应该怎么办呢?当然,您并不希望输入数百个单独的 mv 命令。相反,您可以输入下面的命令:

代码如下:


foreach file in (*.txt)
do
mv $file.bak $file
done

它适用于一些简单的情况,如本示例中的情况。然而,这类任务非常常见,可以使用另一种特殊的实用工具,它能够更快速地完成这项任务。以下命令:

代码如下:


$ rename 's/\.bak$//' *.bak

执行了相同的任务。正则表达式 s/\.bak$// 将命令行中列出的每个文件名后面的 .bak 删去,在本示例中是 * 或所有文件,并使用缩短后的名称作为目标文件名。

当文件名没有什么规律时,rename 命令尤其有用。例如,可以考虑下面这个目录中的内容,它看起来像一个大学一年级新生的信件集合。

代码如下:


$ ls
RenT.txt bEErMoNey.txt gASmoNey.TXt

上面的 foreach 脚本无法处理这个问题,因为这些文件名毫无规律可循。而 rename 可以轻松地对其进行处理:

代码如下:


$ rename 'y/A-Z/a-z/' *

正则表达式 y/A-Z/a-z/ 中的 y 操作符用于进行转换。转换工作需要两个列表:一个原始字符列表和一个替换字符列表。如果这两个列表大小相同,那么在这段文本中,将原始列表中第一个字符的实例替换为替换列表中的第一个字符。换句话说,在本示例中,每个大写"A"的实例都将替换为小写"a"、"B"替换为"b",依此类推。文本中的小写字母保持不变。

如果您需要先对 rename 所执行的工作进行预览,那么可以添加 -n 选项。这个选项可以显示该命令所执行的工作,但并不真正地进行这些更改:

代码如下:


$ rename -n 'y/A-Z/a-z/' *
RenT.txt renamed as rent.txt
bEErMoNey.txt renamed as beermoney.txt
gASmoNey.TXt renamed as gasmoney.txt
$ rename 'y/A-Z/a-z/' *
$ ls
beermoney.txt gasmoney.txt rent.txt

其中有一个缺点需要避免:在 UNIX 系统中,文件名是区分大小写的。一个目录中可能包含 Aa.Txt 和 aA.txT。如上所述,可以编写一条重命名规则将区分大小写的文件名转换为小写文件名,这样可能会与以前已存在的唯一的文件名发生冲突。在这种情况下,rename 将如何操作呢?让我们来看一下:

代码如下:


$ rename -n 'y/A-Z/a-z/' *
Aa.Txt renamed as aa.txt
aA.txT renamed as aa.txt
$ rename 'y/A-Z/a-z/' *
aA.txT not renamed: aa.txt already exists
$ ls
aA.txT aa.txt

如果您希望在进行重命名的过程中删除现有的文件,那么可以添加 -f 标志。在这个示例中,将得到一个名为 aa.txt 的文件。那么哪个文件是其原始文件呢?因为 rename 按照字母顺序进行处理,后面的 aA.txT 文件是现在的 aa.txt。为什么要使用 -f 呢?如果两个文件是相同的,仅仅是名称不同,rename -f 会删除重复的文件。

不要删除重复的文件

文件管理是使用 UNIX 系统时非常重要的工作。系统中包含大量的配置文件。您可能拥有非常多的数据文件和个人文件。您可能不时地需要删除或覆盖某个有价值的文件。Shell 和一些文件管理实用工具可以帮助您避免灾难。

在 Shell 提示符处输入下面的命令。这些命令可以在 bash 中执行,但 zsh 和其他 Shell 也具有类似的选项。

代码如下:


$ alias mv=mv -i
$ alias rm=rm -i
$ set -o noclobber

前两个命令分别在命令行中将 mv 替换为 mv -i、将 rm 替换为 rm -i。交互式的模式强制您对操作进行确认。

第三个命令在 Shell 中提供了一定的安全性。启用了 noclobber 之后,您就不会一不小心使用 > 重定向操作符覆盖某个文件:

代码如下:


$ ls
secret.txt
$ cat > secret.txt
bash: secret.txt: cannot overwrite existing file

要禁用 noclobber,可以输入:

代码如下:


set +o noclobber

。您还可以在任何时候使用 >|(一个小于号加上一个竖线)重定向操作符强制进行覆盖。

代码如下:


$ cat secret.txt
I love green eggs and ham.
$ echo "No more secrets" >| secret.txt
$ cat secret.txt
No more secrets

关于本地的一些秘密

如果您真的希望发现一个城市,那么您得到当地的公众聚谈之处走访一下。下面是一些命令行的组合,相当于提供旅游资讯的 Zagat。

mkdir -p 可以快速地创建层次结构。使用 -p 选项后,mkdir 将为指定路径创建所有的目录和子目录:

代码如下:


$ mkdir -p make/many/directories/at/once
$ ls -R
./make:
many

./make/many:
directories

./make/many/directories:
at

./make/many/directories/at:
once

./make/many/directories/at/once:

如果您需要了解下一个发薪日的时间,只需要输入 cal。不带任何参数时,cal 将显示当前月份的日历。cal -3 命令显示上个月、这个月和下个月的日历,而 cal 06 2009 将显示 2009 年 6 月的日历。(我的生日是那一年的某个星期一!)

代码如下:


$ cal

November 2006
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
$ cal 06 2009

June 2009
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

因为 UNIX 具有许多命令,所以不太可能记住所有实用工具的所有选项。事实上,有时候甚至记不住实用工具的名称。

在遇到困难时,可以求助于 man。例如,要查看如何使用 man 本身,可以输入 man man。使用 man rm 和 man mv,您还可以查看有关 rm 和 mv 的解释。并且,如果清楚需要查找的主题,那么您可以使用 man -k 查找与该主题相关的 man 页面列表。

代码如下:


$ man -k cron
cron (8) - daemon to execute scheduled commands (Vixie Cron)
crontab (1) - maintain crontab files for individual users (V3)
crontab (5) - tables for driving cron
dh_installcron (1) - install cron scripts into etc/cron.*

在本示例中,man 找出了一些实用工具的 man 页面,其中有一行描述内容中包含单词 cron。这些 man 页面中可能解释了如何使用 cron,这是一个负责系统任务调度的守护进程。

那么其中的数值代表什么含义呢?每个数值表示联机 UNIX 手册中的一个部分。第 1 部分保留用于 UNIX 用户可以在 Shell 中运行的所有命令。第 5 部分描述了一些文件格式。第 8 部分对系统管理命令进行了编目。其他的部分描述了系统调用 (2)、库调用 (3),等等。

正如您所看到的,大多数命令都会产生某类输出。大多数命令行命令使用标准输出来显示结果。但其他的一些命令则使用标准输出和标准错误,并按顺序显示处理过程和错误消息。如果您希望忽略这类输出(这是非常有价值的,因为它通常可以干预命令行中执行的操作),那么可以将输出重定向到 UNIX bit bucket,/dev/null。这些位只能进,不能出。

下面是一个简单的示例:

代码如下:


$ ls
secret.txt
$ cat secret.txt
I am the Walrus.
$ cat secret.txt > /dev/null
$ cat socrates.txt > /dev/null
cat: socrates.txt: No such file or directory
$ cat socrates.txt >& /dev/null
$ echo Done.
Done.

如果将 cat 的标准输出重定向到 /dev/null,那么将不会显示任何内容,因为已将所有的位发送到了虚拟的"永久竖向文件"。然而,如果出现了错误,将显示发送到标准错误的错误消息。如果您希望忽略所有的输出,可以使用 >& 操作符以便将 stdout 和 stderr 丢弃。

您还可以将 /dev/null 作为一个长度为零的文件,以清空现有的文件或者创建新的空白文件:

代码如下:


$ cat secret.txt
Anakin Skywalker is Darth Vader.
$ cp /dev/null secret.txt
$ cat secret.txt
$ echo "The moon is made of cheese!" > secret.txt
$ cat secret.txt
The moon is made of cheese!
$ cat /dev/null > secret.txt
$ cat secret.txt
$ cp /dev/null newsecret.txt
$ cat newsecret.txt
$ echo Done.

Done.顺便提一下,如果您在 Macintosh 中使用 UNIX,那么可以在一个终端窗口中尝试 open 命令。例如,如果当前工作目录中有一个名为 poodle.jpg 的文件,命令 open poodle.jpg 将启动 Preview 并打开 poodle.jpg,Preview 是 Mac OS X 中内置的图像查看器。Mac OS X open 是命令行和 Macintosh 的窗口环境之间的纽带,并且它比借助于 Finder 要快得多。

感谢各位的阅读!关于"UNIX命令行惯用语有哪些"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

文件 命令 代码 实用 工具 文件名 系统 实用工具 目录 处理 输出 内容 输入 标准 示例 错误 原始 名称 操作符 工作 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全购物英语作文 修改pg数据库安全报错级别 六安公司二手服务器回收按需定制 公司考勤系统数据库结构图 造成服务器内存过低的原因 苹果怎么还原流量数据库 软件开发税法政策 安全的可以自由生存的服务器 肯德基app订单服务器异常 迅帮网络技术有限公司怎么样 根据数据库代码生成网页 智宸网络技术有限公司 海岛纪元达到服务器等级还有经验 软件开发项目状态区分 洛阳八零创景网络技术有限公司 安装中间件提示服务器发生异常 dota2 服务器卡 近三年网络安全趋势 新零售软件开发设计 用友需要哪些数据库 swift连接服务端数据库 dnf手游韩服服务器界面进不去 玩英雄联盟选什么云服务器 数据库外键怎么写编码 安全桌面都包含什么数据库 安全的可以自由生存的服务器 软件开发立项报告 如何写 用户数据库设计 深圳智能消防软件开发怎么收费 交通银行软件开发中心简介
0