我在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
?
答案 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)
实际上你可以通过几种方式做到这一点:
sed
使用dirname
和basename
:
./myprogram -i "$f" -o "$(dirname -- "$f")/new/$(basename -- "$f" .jpg).tiff"
仅使用Bash:
./myprogram -i "$f" -o "${f%/*}/new/$(b=${f##*/}; echo -n ${b%.jpg}.tiff)"
请注意,与第二个解决方案(使用dirname/basename
)不同,第三个解决方案(在纯Bash中)如果"$f"
不包含任何斜杠,则无法工作:
$ dirname "file.jpg"
.
$ f="file.jpg"; echo "${f%/*}"
file.jpg
答案 2 :(得分:1)
如果您使用的是支持basename
和dirname
命令的系统,则可以使用简单的包装函数,例如:
$ 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