简洁的 bash 脚本替换绝对路径中的文件名

简洁的 bash 脚本替换绝对路径中的文件名

我需要在 bash 脚本中使用简洁且可读的函数,该函数将作为输入:

  • 绝对路径(例如 /home/user/tmp/data/sample1.txt )
  • 新文件名(例如extend_sample.dat)

并返回

具有新文件名的绝对路径(例如 /home/user/tmp/data/extended_sample.dat )

先感谢您!

答案1

有 2+1(额外)命令可以让处理路径名变得轻松:

  • basename - 从文件名中删除目录和后缀
  • dirname - 从文件名中删除最后一个部分

  • readlink - 打印解析的符号链接或规范文件名

所以回答你的问题:

old_path=/home/user/tmp/data/sample1.txt
new_file=extended_sample.dat

new_path="$(dirname $old_path)/$new_file"

或者更改原始文件的路径名:

alt_path=/mnt/newroot/foo

new_path="$alt_path/$(basename $old_path)"

提取正在运行的脚本的完整位置(如果脚本是在其自己的文件中执行的,则有效):

dirname $(readlink -f ${0})

使用这 3 个命令,您可以轻松完成大部分路径操作。

答案2

注意,return语句中巴什函数用于返回数值作为状态代码。

在最简单的情况下它看起来如何:

#!/bin/bash

path="/home/user/tmp/data/sample1.txt"
new_name="extended_sample.dat"

function get_new_path() { echo "${1%/*}/$2"; }

new_path=$(get_new_path "$path" "$new_name")
echo "$new_path"

上面将输出:

/home/user/tmp/data/extended_sample.dat

答案3

只是玩弄bashnamerefs:

path_replace_file () {
    local -n pathvar="$1"
    pathvar="${pathvar%/*}/$2"
}

pathname="/home/user/tmp/data/sample1.txt"

printf 'pathname before = %s\n' "$pathname"
path_replace_file pathname extended_sample.dat
printf 'pathname after  = %s\n' "$pathname"

输出:

pathname before = /home/user/tmp/data/sample1.txt
pathname after  = /home/user/tmp/data/extended_sample.dat

path_replace_file函数需要一个变量名作为它的第一个参数。在函数中,pathvar其作用类似于该变量的别名(名称引用)。

该函数将 值的文件名部分替换$pathval为函数第二个参数给出的值。

这需要bash4.3 或更高版本。

更改local -ntypeset -n也会使其正常工作ksh93

相关内容