Получение относительных путей в Баш


Я уже искал это, но я думаю, что не было большого спроса на работу с путями. Поэтому я пытаюсь написать сценарий bash для преобразования моей музыкальной коллекции с помощью файлов tta и cue. Моя структура каталогов выглядит следующим образом:/Volumes/External/Music/Just/Some/Dirs / Album.ТТА для ТТА файлов и /объемы/внешних/путевые подсказки по ним/просто/какой-то альбом/Изд/.кий для листов Кия.

Мой текущий подход-установить /Volumes / External как "root_dir" и получить относительный путь к альбому.TTA файл в $ROOT_DIR / Music (в данном случае это будет просто/Some/Dirs / альбом.tta), затем добавьте этот результат в $ROOT_DIR/Cuesheets и измените суффикс from .ТТА для .знак.

Моя текущая проблема заключается в том, что dirname возвращает пути, как они есть, что означает, что /Volumes/External/Music/Just/Some/Dirs не преобразуется ./Just / Some / Dirs / when my current folder is $ROOT_DIR / Music and the absolute path was given.

Add: / / вот скрипт, если у кого-то есть подобные проблемы:

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

2 ответа:

Если ваш Cuesheets dir всегда находится в том же каталоге, что и Ваша музыка, вы можете просто удалить root_dir из Пути, и останется относительный путь. Если у вас есть путь к вашему альбому.ТТА в album_path (album_path=/Volumes/External/Music/Just/Some/Dirs/Album.tta) и свой набор root_dir(root_dir=/Volumes/External), вобще ${album_path#$root_dir}. Это обрезает root_dir от передней части album_path, так что вы остаетесь с album_path=Just/Some/Dirs/Album.tta.

См Баш документы для получения дополнительной информации на bash работа со строками

EDIT: / / изменен ${$album_path#$root_dir} на ${album_path#$root_dir}

Итак, я решил эту проблему несколькими способами в прошлом. Я не рекомендую связываться с путями и переменными окружения 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

Если это то, что вы можете делать часто, я бы просто написал отдельный сценарий специально для этого.