使用 Bash 删除文件扩展名
本文讨论使用 bash 脚本通过 cut
命令和 basename
bash 命令剪切和显示文件特定字段的方法。我们还将看到它与管道一起使用。然后,我们将看到从文件名中删除扩展名时可能出现的一些问题。
我们还将查看从文件名中修剪文件扩展名并仅显示该文件名的词干版本的多个说明性示例。
使用 cut
方法删除 Bash 中的文件扩展名
cut
方法用于从每一行修剪文件的某些部分。此命令将文件名和选项(强制)作为参数,并在标准控制台上输出结果。我们也可以使用它来删除文件扩展名。为此,-f
选项与文件名一起使用。一些可用选项的简要说明如下。
-
-b
(字节):此选项在指定字节数之后从所有行中修剪部分文本。 -
-c
(列):用于从文件中剪切特定列或列范围,并在 consol 上显示剩余部分。 -
-f
(字段):两个分隔符号(第一个除外)之间的符号集合称为字段。对于文件中的每一行,-f
仅显示使用整数字段编号提到的字段或行的部分。tab
默认情况下被视为分隔符。但是,我们可以使用-d
标志来定义任何用户定义的分隔符号。带有-f
和d
选项的cut
命令的概要如下。
$ cut -f (comma separated field numbers) -d "delimiting symbol" filename.txt
还有其他可用的选项,例如 -complement
、-output-delimiter
和 -version
。你可以使用 cut --help
获取帮助以获取更多信息。
示例 1:从内容中删除扩展
请考虑以下示例以了解有关 -f
和 -d
的更多信息。假设 webpages.txt 包含特定网站的不同 HTML 网页的名称,每一个都在一个新行中。让我们通过在终端上执行 cat
命令来查看 webpages.txt 的内容:-
$ cat webpages.txt
index.html
contact_us.html
login.html
dashboard.html
以下 bash 脚本将删除 pages.txt 中所有文件名的扩展名,并将输出显示到标准控制台。假设我们创建了一个名为 script 的 shell 脚本文件,并在其中编写了以下代码。
#!/bin/sh
#script file
file=webpages.txt
cut -f 1 -d '.' $file
这里 -f
前面的 1
用于仅保留第一个字段,而 .
在 -d
选项中表示应使用 .
分隔字段象征。因此,该脚本保留第一个 .
之前的每一行 pages.txt 中的所有文本。遇到。让我们看看输出。
输出:
index
contact_us
login
dashboard
在这里,如果我们将字段编号设置为 2
,则每行仅应在屏幕上打印第二个字段(即 HTML)。
示例 2:使用管道从存储在变量中的文件名中删除扩展名并将其显示在控制台上
假设你要从存储在变量中的文件名中删除扩展名。下面的一段代码将做到这一点。
file=webpages.txt
echo "$file" | cut -f 1 -d '.'
输出:
webpages
上面的代码通过管道将存储在 file
变量中的文件名传递给 cut 命令,该命令仅保留文本的第一个字段。
示例 3:使用管道从存储在变量中的文件名中删除扩展名并将其分配给另一个变量
file=webpages.txt
trimmed=$(echo "$filename" | cut -f 1 -d '.')
echo "$trimmed"
输出
webpages
上述代码使用命令替换法将命令的输出替换为命令的位置。因此,无论分配输出的右侧如何,都会分配 trimmed
。
在 Bash 中删除文件扩展名时的问题
当文件名在文件名中包含分隔符本身时,上述公式将仅返回第一次遇到分隔符之前的文本。我们可以通过反向切割名称来解决这个问题。
让我们看看下面的代码。
file=abcd.efg.hmtl
trimmed=$(echo "$filename" | cut -f 2- -d '.')
echo "$trimmed"
输出:
abcd
在上面的代码中,file
变量在赋值中多了一个点。输出将包含第一个字段中的所有文本,该字段在遇到第一个点时结束。
解决方案:我们可以在将 file
的内容通过管道传递给 cut
命令之前对其进行反转。之后,cut
命令将保留所有字段,除了反转文本中的第一个字段。现在,需要再次反转才能得到最终答案。
file=abcd.efg.html
trimmed=$(echo "$file" | rev | cut -f 2- -d '.' | rev)
echo "$trimmed"
输出:
abcd.efg.html
请注意 f
选项值的变化。选项 -f 2-
用于保留位置值为 2 或更大的所有字段。
在 Bash 中使用 basename
命令删除文件扩展名
如果你知道扩展名,则可以使用 basename
命令从文件名中删除扩展名。
file=abcd.abc.html
trimmed=$(basename $file .html)
echo "$trimmed"
输出
abcd.abc
basename
命令的第一个命令行参数是变量名,扩展名是第二个参数。basename
命令扫描文本并打印第一次遇到扩展名之前的所有内容(在我们的例子中为 .html
)。
相关文章
如何在 CentOS 中获取 IP 地址
发布时间:2023/05/04 浏览次数:108 分类:操作系统
-
这篇简短的文章是对 CentOS 的一个简短介绍,然后简要讨论了我们如何使用命令行界面 (CLI) 在 CentOS 中获取服务器 IP 地址。
在 Linux 中更新 YUM
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
本文介绍了 Linux 中的 yum update 命令。本文将教我们如何在 Linux 中更新 YUM,以及如何在 Linux 系统上安装、更新、删除、查找和管理包。
在 Linux 中安装 Deb 文件
发布时间:2023/05/04 浏览次数:130 分类:操作系统
-
本文介绍如何在 Linux 中安装 deb 文件。在这篇 Linux 文章中,我们将学习如何在 Linux 系统上安装 .deb(Debian 软件包)文件。 我们还将看到如何在安装后删除 .deb 文件。
Linux 中的 lsof 命令
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
在这篇 Linux 文章中,我们将了解 Linux 操作系统中的 lsof 命令。 我们将看到如何在 Linux 中将此命令用于不同目的。
Linux 解决不能执行二进制文件问题
发布时间:2023/05/04 浏览次数:187 分类:操作系统
-
在本文中,我们将学习如何在 Linux 中执行二进制文件。 如果 Linux 无法执行二进制文件,我们还将学习如何解决错误。
Linux 中错误 Mesg: Ttyname Failed: Inappropriate Ioctl for Device Error
发布时间:2023/05/04 浏览次数:145 分类:操作系统
-
本文介绍如何在 Linux 中解决 mesg: ttyname failed: inappropriate ioctl for device 错误。在 Linux 中,这个错误是由于默认的 vagrant 配置 config.ssh.shell 与 bash -l 交互导致的。
Linux 中的 ps aux 命令
发布时间:2023/05/04 浏览次数:69 分类:操作系统
-
本篇文章将讨论 Linux 中的 ps aux 命令。如果将 aux 快捷方式与 ps 命令一起使用,它将显示用户需要的最多信息,并可以为您提供系统运行进程的当前状态。
Linux 中的 NTP
发布时间:2023/05/04 浏览次数:137 分类:操作系统
-
本篇文章将讨论 Linux 中的 ntp。NTP 是大多数 IT 基础设施使用的核心协议。 使用它的目的是同步日期和时间信息。
在 Bash 中创建进度条
发布时间:2023/05/04 浏览次数:164 分类:操作系统
-
这是有关在 Bash 中创建进度条以显示正在运行的命令或进程的进度的指南。本文将探讨在 Bash(Linux 和 macOS 的默认 shell)中向 shell 脚本添加进度条的几种方法。使用 pv 命令在 Bash 中创建进度条