script bash conciso para substituir o nome do arquivo no caminho absoluto

0

Eu preciso de uma função concisa e legível para ser usada no script bash que terá como entrada:

  • caminho absoluto (por exemplo, /home/user/tmp/data/sample1.txt)
  • nome do novo nome do arquivo (por exemplo, extended_sample.dat)

e retornar

caminho absoluto com novo nome de arquivo (por exemplo, /home/user/tmp/data/extended_sample.dat)

Obrigado antecipadamente!

    
por tomekpe 18.02.2018 / 12:24

3 respostas

1

Note que a instrução return nas funções bash é usada para retornar um valor numérico como um código de status.

Como isso pode parecer no caso mais simples:

#!/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"

O texto acima será exibido:

/home/user/tmp/data/extended_sample.dat
    
por 18.02.2018 / 12:45
3

Existem 2 + 1 (bônus) comandos que facilitam a vida ao lidar com nomes de caminho:

  • nome da base - tira o diretório e o sufixo dos nomes de arquivos
  • dirname - tira o último componente do nome do arquivo

  • readlink - imprime links simbólicos resolvidos ou nomes de arquivos canônicos

Então, responda sua pergunta:

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

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

Ou para alterar o nome do caminho do arquivo original:

alt_path=/mnt/newroot/foo

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

Extraia o local completo do script em execução (funciona se o script for executado em seu próprio arquivo):

dirname $(readlink -f ${0})

Com esses 3 comandos, você pode fazer a maioria das manipulações de caminho facilmente.

    
por 19.02.2018 / 10:32
-1

Apenas brincando com bash namerefs:

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"

Saída:

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

A função path_replace_file recebe um nome da variável como seu primeiro argumento. Na função pathvar age como um alias (uma referência de nome) para essa variável.

A função substitui a parte do nome do arquivo do valor de $pathval pelo que é dado como o segundo argumento para a função.

Isso requer bash 4.3 ou posterior.

A alteração de local -n para typeset -n fará com que funcione em ksh93 também.

    
por 18.02.2018 / 13:24