使用 Bash 删除文件扩展名

Muhammad Husnain 2023年1月30日 2022年5月11日
  1. 使用 cut 方法删除 Bash 中的文件扩展名
  2. 在 Bash 中删除文件扩展名时的问题
  3. 在 Bash 中使用 basename 命令删除文件扩展名
使用 Bash 删除文件扩展名

本教程讨论使用 bash 脚本通过 cut 命令和 basename bash 命令剪切和显示文件特定字段的方法。我们还将看到它与管道一起使用。然后,我们将看到从文件名中删除扩展名时可能出现的一些问题。

我们还将查看从文件名中修剪文件扩展名并仅显示该文件名的词干版本的多个说明性示例。

使用 cut 方法删除 Bash 中的文件扩展名

cut 方法用于从每一行修剪文件的某些部分。此命令将文件名和选项(强制)作为参数,并在标准控制台上输出结果。我们也可以使用它来删除文件扩展名。为此,-f 选项与文件名一起使用。一些可用选项的简要说明如下。

  • -b(字节):此选项在指定字节数之后从所有行中修剪部分文本。
  • -c(列):用于从文件中剪切特定列或列范围,并在 consol 上显示剩余部分。
  • -f(字段):两个分隔符号(第一个除外)之间的符号集合称为字段。对于文件中的每一行,-f 仅显示使用整数字段编号提到的字段或行的部分。tab 默认情况下被视为分隔符。但是,我们可以使用 -d 标志来定义任何用户定义的分隔符号。带有 -fd 选项的 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)。

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

相关文章 - Bash File