使用 Bash 获取文件名和扩展名
Ozair Malik
2023年1月30日
近年来,Bash 脚本变得非常流行,无论是用于你的日常 Linux 管理任务还是整个 DevOps 自动化任务。
假设你发现自己想在 bash 脚本中分别提取文件名及其扩展名。例如,有一个名为 server.py
的 python 文件。我们希望通过分隔名称 server
和扩展名 py
将该字符串分成两部分。
使用 Bash 获取文件名和扩展名
为了演示目的,我们编写了一个 bash 脚本。如果需要,你可以在脚本中的任何位置使用此代码。
- 首先,我们将检查用户是否提供了正确的参数。下面的代码片段使用了一个
if
语句,使=
等于 00
,这意味着没有提供任何参数;在这种情况下,我们将使用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 或命令提示符以避免任何与权限相关的问题。