絶対パスのファイル名を置き換える簡潔な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

ちょうどnamerefで遊ぶbash

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関数の2番目の引数として指定された値に置き換えます。

これにはbashバージョン4.3以降が必要です。

local -nに変更するとtypeset -n機能しますksh93

関連情報