在BASH中获取相对路径

时间:2011-11-19 18:45:17

标签: bash path

我已经搜索了这个,但我想对使用路径没有很大的要求。 所以我尝试两个写一个bash脚本来使用tta和cue文件转换我的音乐集。 我的目录结构如下:tta文件的/Volumes/External/Music/Just/Some/Dirs/Album.tta和cue表的/Volumes/External/Cuesheets/Just/Some/Dirs/Album.cue。

我目前的方法是将/ Volumes / External设置为" root_dir"并获取album.tta文件的相对路径为$ ROOT_DIR / Music(在这种情况下,这将是Just / Some / Dirs / Album.tta),然后将此结果添加到$ ROOT_DIR / Cuesheets并从.tta更改后缀到.cue。

我目前的问题是,dirname按原样返回路径,这意味着/ Volumes / External / Music / Just / Some / Dirs不会转换为./Just/Some/Dirs/当我当前的文件夹是$ ROOT_DIR /音乐和绝对路径。

添加://如果有人遇到类似的问题,这是脚本:

#!/bin/bash
ROOT_DIR=/Volumes/External
BASE="$1"

if [ ! -f "$BASE" ]
then
    echo "Not a file"
    exit 1
fi

if [ -n "$2" ]
then
    OUTPUT_DIR="$HOME/tmp"
else
    OUTPUT_DIR="$2"
fi
mkfdir -p "$OUTPUT_DIR" || exit 1

BASE=${BASE#"$ROOT_DIR/Music/"}
BASE=${BASE%.*}

TTA_FILE="$ROOT_DIR/Music/$BASE.tta"
CUE_FILE="$ROOT_DIR/Cuesheets/$BASE.cue"
shntool split -f "${CUE_FILE}" -o aiff -t "%n %t" -d "${OUTPUT_DIR}" "${TTA_FILE}"
exit 0

2 个答案:

答案 0 :(得分:8)

如果您的Cuesheets目录始终与您的音乐位于同一目录中,您只需从路径中删除root_dir,剩下的就是相对路径。如果您拥有album_path(album_path=/Volumes/External/Music/Just/Some/Dirs/Album.tta)中的album.tta和root_dir设置(root_dir=/Volumes/External)的路径,请执行${album_path#$root_dir}。这会修剪来自album_path前面的root_dir,因此您将留下album_path=Just/Some/Dirs/Album.tta

有关bash字符串操作的更多信息,请参阅bash docs

编辑://将$ {$ album_path#$ root_dir}更改为$ {album_path#$ root_dir}

答案 1 :(得分:1)

好的,所以我过去曾经解决过这个问题。我不建议使用路径和pwd环境变量,我已经看到了一些灾难性的事件。

这就是我要做的事情

CURRENTDIR=/Volumes/External/Music # make sure you check the existence in your script
...
SEDVAL=$(echo $CURRENTDIR | sed s/'\/'/'\\\/'/g)
#run your loops for iterating through files
for a in $(find ./ -name \*ogg); do
  FILE=`echo $a | sed s/$SEDVAL/./g`  # strip the initial directory and replace it with .
  convert_file $FILE # whatever action to be performed
done

如果您经常这样做,我实际上只是为此编写一个单独的脚本。