修改存储在bash脚本变量中的路径

时间:2018-06-13 18:35:03

标签: bash shell

我在bash脚本中有一个变量f

f=/path/to/a/file.jpg

我使用变量作为需要输入和输出路径的程序的输入参数。

例如,程序的用法如下所示

./myprogram -i inputFilePath -o outputFilePath

使用我的变量,我试图保持相同的基本名称,更改扩展名,并将输出文件放入子目录。例如

./myprogram -i /path/to/a/file.jpg -o /path/to/a/new/file.tiff

我试图通过这样做

来做到这一点

./myprogram -i "$f" -o "${f%.jpg}.tiff"

当然这会保留basename,更改扩展名,但不会将文件放入new子目录。

如何修改f以将/path/to/a/file.jpg更改为/path/to/a/new/file.tiff

3 个答案:

答案 0 :(得分:1)

您可以使用此sed

s='/path/to/a/file.jpg'
sed -E 's~(.*/)([^.]+)\.jpg$~\1new/\2.tiff~' <<< "$s"

/path/to/a/new/file.tiff

答案 1 :(得分:1)

实际上你可以通过几种方式做到这一点:

  1. 使用@anubhava
  2. 指出的sed
  3. 使用dirnamebasename

    ./myprogram -i "$f" -o "$(dirname -- "$f")/new/$(basename -- "$f" .jpg).tiff"
    
  4. 仅使用Bash:

    ./myprogram -i "$f" -o "${f%/*}/new/$(b=${f##*/}; echo -n ${b%.jpg}.tiff)"
    
  5. 请注意,与第二个解决方案(使用dirname/basename)不同,第三个解决方案(在纯Bash中)如果"$f"不包含任何斜杠,则无法工作:

    $ dirname "file.jpg"
    .
    $ f="file.jpg"; echo "${f%/*}"
    file.jpg
    

答案 2 :(得分:1)

如果您使用的是支持basenamedirname命令的系统,则可以使用简单的包装函数,例如:

$ type newSubDir
newSubDir is a function
newSubDir ()
{
    oldPath=$(dirname "${1}");
    fileName=$(basename "${1}");
    newPath="${oldPath}/${2}/${fileName}";
    echo "${newPath}"
}

$ newSubDir /path/to/a/file.jpg new
/path/to/a/new/file.jpg

如果你的系统没有那些,你可以使用字符串操作完成同样的事情:

$ file="/path/to/a/file.jpg"

$ echo "${file%/*}"
/path/to/a

$ echo "${file##*/}"
file.jpg