Bash获取文件名或目录名的基本名
时间:2020-01-09 10:37:22 来源:igfitidea点击:
我需要在Linux上运行的bash中提取文件基名。
如何使用bash获取给定路径的文件名或目录名的基本名称?
说明:可以使用内置命令或外部命令在bash shell中提取文件名和扩展名。
$字符引入参数扩展,命令替换或算术扩展。
有关更多信息,请参见如何像Pro一样使用Bash参数替代。
该页面显示了使用各种方法来删除bash中没有路径和扩展名的文件基本名称。
Bash获取文件名或目录名的基本名
要在Bash中提取文件名和扩展名,请使用以下任一方法:
basename /path/to/file.tar.gz .gz
从文件名中删除目录和后缀${VAR%pattern}
删除文件扩展名${VAR#pattern}
从最前面的最短模式删除
让我们在bash中查看一些示例以获取文件名的基本名称。
Bash获取文件名和扩展名
要仅从给定路径获取文件名:
FILE="/home/Hyman/lighttpd.tar.gz" basename "$FILE" f="$(basename -- $FILE)" echo "$f"
不使用basename命令获取文件名
语法为:
FILE="/home/Hyman/lighttpd.tar.gz" echo ${FILE##*/} ## another example ## url="https://www.theitroad.local/files/mastering-vi-vim.pdf" echo "${url##*/}"
使用bash参数获取运行脚本名称
$0将提供当前正在运行的脚本的完整路径。
仅提取该名称:
#!/bin/bash _self="${0##*/}" echo "$_self is called" ## or in usage() ## usage(){ echo "$_self: arg1 arg2" }
Bash获取文件扩展名
请尝试以下示例:
FILE="/home/Hyman/lighttpd.tar.gz" echo "${FILE#*.}" # print tar.gz echo "${FILE##*.}" # print gz ext="${FILE#*.}" # store output in a shell variable echo "$FILE has $ext" # display it
如何从bash中的完整文件名路径获取基本名称
使用以下任何一种语法:
file="/home/Hyman/.gpass/passwd.enc" basename $file echo ${file##*/}
当您知道.enc是扩展名时,让我们获取$file的第一部分:
file="/home/Hyman/.gpass/passwd.enc" basename $file .enc ## without using basename ## t="${t%.enc"} t="${t%.enc}" echo "$t"
在Bash中提取文件名和扩展名的脚本示例
#!/bin/bash # Purpose: Compile latest Linux kernel # Author: Hyman Gite {https://www.theitroad.local/} # License: GPL version 2.0 or above # ---------------------------------------------------------------- set -e _out="/tmp/out.$$" dldir=~/linux isdl=1 # do not download current="$(uname -r)" curl -s https://www.kernel.org/ > "$_out" url="$(grep -A 2 '<td id="latest_button">' ${_out} | grep -Eo '(http|https)://[^/"]+.*xz')" gpgurl="${url/tar.xz/tar.sign}" file="${url##*/}" remote="${file%.tar.xz}" remote="${remote#linux-}" echo "* Current Linux kernel: $current" echo "* Remote Linux kernel version: $remote" [ "$current" = "$remote" ] || isdl=0 if [ $isdl = 0 ] then notify-send "A new kernel version ($remote) has been released." echo "* Downloading new kernel ..." wget -qc "$url" -O "${dldir}/${file}" wget -qc "$gpgurl" -O "${dldir}/${gpgurl##*/}" echo "* Using gpg to verify new tar ball ..." cd "$dldir" xz -fd "$file" gpg --verify "${gpgurl##*/}" if [ $? -eq 0 ] then notify-send "Now compiling kernel ver $remote..." tar xf "${file%.xz}" cd "${file%.tar.xz}" cp -v "/boot/config-$(uname -r)" .config make -j $(nproc) && /usr/bin/notify-send "Password needed to install new kernel..." && sudo make modules_install && sudo make install && sudo reboot fi fi