Получение относительных путей в Баш
Я уже искал это, но я думаю, что не было большого спроса на работу с путями. Поэтому я пытаюсь написать сценарий 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 ответа:
Если ваш 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
Если это то, что вы можете делать часто, я бы просто написал отдельный сценарий специально для этого.