Bash从Linux或Unix上的给定路径获取文件名

时间:2020-01-09 10:37:22  来源:igfitidea点击:

如何从给定路径中提取Bash shell脚本中的文件名和扩展名?
如何从bash shell下的路径获取文件名?
可以从在Linux或类似Unix的系统上运行的bash shell脚本中的路径中获取文件名。
可以使用以下任何一种方法来提取bash中的文件名或扩展名。

Bash从给定路径获取文件名

basename命令删除目录和文件名的后缀。
语法非常简单:

basename /path/to/file
basename /path/to/file suffix

例子

让我们看看如何从给定文件(例如/bin/ls)中提取文件名。
键入以下基本名称命令:

basename /bin/ls

您可以使用-a选项传递多个参数,如下所示:

basename -a /bin/date /sbin/useradd /nas04/nfs/theitroad/data.tar.gz

将输出存储在shell变量中,运行:

out="$(basename /data/backup-file.tar.gz)"
echo "Filename is $out"

如何从文件名中删除extesnion

从backups.tar.gz文件中删除.gz,仅获取backups.tar:

basename /backups/14-nov-2019/backups.tar.gz .gz

或者

basename -s .gz /backups/14-nov-2019/backups.tar.gz
#
# Bash get filename from path and store in $my_name variable 
#
my_name="$(basename -s .gz /backups/14-nov-2019/backups.tar.gz)"
echo "Filename without .gz extension : $my_name"

在Bash中提取文件名和扩展名

从bash手册页:

$字符引入参数扩展,命令替换或算术扩展。
可以将要扩展的参数名称或符号括在括号中,该括号是可选的,但用于保护要扩展的变量不受紧随其后的字符的影响,这些字符可以解释为名称的一部分。
当使用花括号时,匹配的结尾花括号是第一个},而不是由反斜杠或带引号的字符串引起来,并且不在嵌入式算术扩展,命令替换或参数扩展内。
参数扩展的基本形式是${parameter}。
参数的值被替换。

如何在bash shell脚本中提取文件名和扩展名

例如,定义一个名为$input的shell变量。
让我们创建一个名为test.sh的shell脚本:

#!/bin/bash
input="/home/Hyman/work/config.ini"
# extract config.ini
file_name="${input##*/}"
# get .ini 
file_extension="${file_name##*.}"
# get config 
file="${file_name%.*}"
# print it
echo "Full input file : $input"
echo "Filename only : $file_name"
echo "File extension only: $file_extension"
echo "First part of filename only: $file"

在Linux中执行shell脚本,运行:

chmod +x test.sh
./test.sh
bash test.sh