절대 경로의 파일 이름을 대체하는 간결한 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함수의 두 번째 인수로 제공된 값으로 바꿉니다.

이를 위해서는 bash버전 4.3 이상이 필요합니다.

local -n로 변경하면 typeset -n작동하게 됩니다 ksh93.

관련 정보