2011-11-19 70 views
4

我已经搜索了这个,但我想这对于处理路径没有太大的需求。 因此,我试着用bash脚本写一个bash脚本来使用tta和cue文件转换我的音乐集合。 我的目录结构如下:/Volumes/External/Music/Just/Some/Dirs/Album.tta用于tta文件和/Volumes/External/Cuesheets/Just/Some/Dirs/Album.cue用于提示表。在BASH中获取相对路径

我目前的做法是将/ 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 
+1

我不清楚这里的问题是什么。 – drysdam

+0

问题是如何从绝对路径中获得某个相关部分。在我的情况下,$ BASE和如何创建它是相关的部分。我告诉我的意图的原因是,我不确定我的方法是否聪明,因为我相信总会有更好的方法去做任何事情。 –

回答

8

如果您Cuesheets DIR总是在相同的目录中的音乐,你可以从路径中删除ROOT_DIR,什么剩下的就是相对路径。如果您在album_path(album_path=/Volumes/External/Music/Just/Some/Dirs/Album.tta)和您的root_dir集(root_dir=/Volumes/External)中拥有album.tta的路径,那么请执行${album_path#$root_dir}。这会从album_path的前面修剪root_dir,所以你只剩下album_path=Just/Some/Dirs/Album.tta

有关更多信息,请参见bash docs上的bash字符串处理

编辑://更改$ {$ album_path#$ ROOT_DIR}至$ {album_path#$ ROOT_DIR}

+1

哦,不,我完全忘了#能够删除字符串。非常感谢,您为我节省了一个充满脚本的夜晚,当我意识到解决方案非常简单时,以及我之所以按照这种方式对提示表进行排序的原因,您为我节省了很多时间。 –

+0

这应该是'$ {album_path#$ root_dir /}' - 在album_path上没有$,而在$ root_dir之后是/,所以它删除了分隔符并且不会误认为绝对路径。 –

1

好了,所以我已经解决了这个一过去的几种方式。我不建议使用路径和密码环境变量,我已经看到了一些灾难性事件。

这里就是我会做

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 

如果这是你可能会做经常我真的只是写一个单独的脚本只是为了这个。