2011-11-19 7 views
4

이미이 항목을 검색했지만 경로로 작업하는 데 큰 요구가 없었습니다. 그래서 저는 tta와 cue 파일을 사용하여 음악 컬렉션을 변환하기 위해 bash 스크립트를 작성하려고합니다. 내 디렉토리 구조는 tta 파일의 경우 /Volumes/External/Music/Just/Some/Dirs/Album.tta이고 큐 시트의 경우 /Volumes/External/Cuesheets/Just/Some/Dirs/Album.cue와 같습니다.BASH에서 상대 경로 가져 오기

현재 "root_dir"로/Volumes/External를 설정하고 album.tta 파일의 상대 경로를 $ ROOT_DIR/Music으로 가져옵니다 (이 경우 Just/Some/Dirs/Album.tta가됩니다) ,이 결과를 $ ROOT_DIR/Cuesheets에 추가하고 접미사를 .tta에서 .cue로 변경하십시오.

내 현재 문제는 경로가 그대로 반환되므로 현재 폴더가 $ 일 때/Volumes/External/Music/Just/Some/Dirs가 ./Just/Some/Dirs/으로 변환되지 않는다는 것을 의미합니다. ROOT_DIR/Music과 절대 경로가 주어졌습니다.

추가 : Cuesheets 디렉토리가 당신의 음악과 같은 디렉토리에 항상있는 경우

#!/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

, 그냥 경로에서 root_dir을 제거 할 수 있고, 무엇을 : 누군가가 비슷한 문제가있는 경우 // 여기에 스크립트입니다 왼쪽은 상대 경로입니다. album_tta (album_path=/Volumes/External/Music/Just/Some/Dirs/Album.tta)에있는 album.tta의 경로와 root_dir (root_dir=/Volumes/External)을 설정 한 경우 ${album_path#$root_dir}을 수행하면됩니다. 이렇게하면 root_dir이 album_path 앞에 오므로 album_path=Just/Some/Dirs/Album.tta이됩니다.

bash는 문자열 조작에 대한 자세한 내용은

편집을 bash docs를 참조하십시오 : // 변경된 $는 {$는 # $으로의 root_dir album_path} $ {album_path을 # $의 root_dir}

+1

아뇨, # 문자열을 제거 할 수 있다는 사실을 완전히 잊었습니다. 고맙습니다. 해결책이 너무 간단하고 왜 그런 방법으로 큐 시트를 정렬했는지 알았을 때 스크립팅과 어색한 순간으로 가득 찬 밤을 구해 줬습니다. –

+0

이것은'$ {album_path # $ root_dir /}'이어야합니다 - album_path에는 $가없고 $/root_dir 뒤에 /는 분리 문자를 제거하고 절대 경로로 오인하지 않습니다. –

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 

을 어떻게 할 것인지입니다.