2011-11-19 107 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 

如果這是你可能會做經常我真的只是寫一個單獨的腳本只是爲了這個。