使用 Bash 获取文件名和扩展名

Ozair Malik 2023年1月30日 2022年5月14日
  1. 使用 Bash 获取文件名和扩展名
  2. 执行 Bash 文件以获取文件名和扩展名
使用 Bash 获取文件名和扩展名

近年来,Bash 脚本变得非常流行,无论是用于你的日常 Linux 管理任务还是整个 DevOps 自动化任务。

假设你发现自己想在 bash 脚本中分别提取文件名及其扩展名。例如,有一个名为 server.py 的 python 文件。我们希望通过分隔名称 server 和扩展名 py 将该字符串分成两部分。

使用 Bash 获取文件名和扩展名

为了演示目的,我们编写了一个 bash 脚本。如果需要,你可以在脚本中的任何位置使用此代码。

  • 首先,我们将检查用户是否提供了正确的参数。下面的代码片段使用了一个 if 语句,使 = 等于 0 0,这意味着没有提供任何参数;在这种情况下,我们将使用 pwd 或我们当前的工作目录作为默认参数。
#!/bin/bash

# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
    cDir=$(pwd) # Setting the cDir variable to current directory
    echo "[-] No directory provided!"
else
    cDir=$1

fi
echo "[+] Setting the directory to $cDir"
  • 接下来,我们检查用户提供的目录是否存在。如果它不存在,我们将退出脚本。
# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
    echo "[-] Directory $cDir doesn't exist!"
    exit
fi
  • 现在,我们开始使用简单的 ls 命令在 allFile 变量中提取目录中可用的文件(当然,如果它有效),该命令在 Linux 和 Windows 操作系统中的 PowerShell 中运行。
# Main extraction:
allFile=`ls $cDir`
echo;
  • 在这里,我们检查提供的路径的最后一个值是否不是/,如果不是,我们将其添加到末尾以避免任何错误。

  • 这不是通过使用 if 语句。${cDir: -1} != '/' 表示 如果文件结尾不是,那么在结尾处增加 /提供的路径。

# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
    cDir+='/'
fi
  • 接下来,我们使用 for loop 和变量 $allFile 遍历文件夹中存在的所有内容。记得之前 $allFile 的值为 ls $cDir
# Iterating over everything in the folder
for item in $allFile; do
    # Appending path to each file:
    item="$cDir$item"

我们在循环中使用 -f 标志检查检测到的文件是否属于 type file。如果是这种情况,我们会从文件名中删除点部分,例如扩展名部分。

  • 最后,我们使用 echo 以我们想要的方式打印结果。
# Checking if current item is a file:
if [[ -f $item ]]; then
	ext=`ls $item | rev | cut -d '.' -f 1 | rev`
	file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
	echo "File Name: $file_name -> Extension: $ext"
fi
  • 此脚本检查特定目录是否存在。如果目录存在,它将提及所有文件及其扩展名。
┌─[root@parrot][/home/user/Downloads]
└──╼ #./test2.sh
[-] No directory provided!
[+] Setting the directory to /home/user/Downloads

File Name: /home/user/Downloads/ExtraCredit_Sockets_Intro -> Extension: pdf
File Name: /home/user/Downloads/project -> Extension: sh
File Name: /home/user/Downloads/test2 -> Extension: sh
File Name: /home/user/Downloads/test -> Extension: txt
注意
我们在没有提供任何目录作为参数的情况下运行脚本,因此它默认下载,即我的当前目录,并提及该目录中存在的所有文件名及其扩展名。

代码的每一行都有注释,所以如果你有任何困惑,你可以检查一下。

如果你想使用这个脚本,这里是它的完整版本。

#!/bin/bash

# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
	cDir=$(pwd) # Setting the cDir variable to current directory
	echo "[-] No directory provided!"
else
	cDir=$1
fi
echo "[+] Setting the directory to $cDir"

# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
	echo "[-] Directory $cDir doesn't exist!"
	exit
fi

# Main extraction:
allFile=`ls $cDir`
echo;

# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
	cDir+='/'
fi

# Iterating over everything in the folder
for item in $allFile; do
	# Appending path to each file:
	item="$cDir$item"
	# Checking if current item is a file:
	if [[ -f $item ]]; then
		ext=`ls $item | rev | cut -d '.' -f 1 | rev`
		file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
		echo "File Name: $file_name -> Extension: $ext"
	fi
done

执行 Bash 文件以获取文件名和扩展名

如果你是尝试学习 bash 的新手并且不知道如何运行,请使用此代码;你所要做的就是创建一个带有 .sh 扩展名的文件,这意味着它是一个 bash 文件。

之后,使用你选择的终端导航到该目录并键入 ./filename,这将执行该文件。

如果你使用的是 Windows 操作系统,请键入 bash file.sh,它应该可以正常运行。

请记住在你的情况下使用脚本的正确文件名。

权限相关问题

注意
在运行脚本时,你可能会遇到权限被拒绝错误。

你需要在终端中使用 chmod +x [文件名] 提供正确的权限。

如果你使用的是 Windows,请以管理员身份运行 PowerShell 或命令提示符以避免任何与权限相关的问题。

相关文章 - Bash File