【问题标题】:Getting relative paths in BASH在 BASH 中获取相对路径
【发布时间】:2012-01-02 00:56:53
【问题描述】:

我已经搜索过这个,但我想对使用路径的需求并不大。 所以我正在尝试两个编写一个 bash 脚本来使用 tta 和 cue 文件转换我的音乐收藏。 我的目录结构如下: /Volumes/External/Music/Just/Some/Dirs/Album.tta 用于 tta 文件, /Volumes/External/Cuesheets/Just/Some/Dirs/Album.cue 用于提示表。/External/Cuesheets/Just/Some/Dirs/Album.cue p>

我当前的方法是将/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 在我当前文件夹为 $ROOT_DIR 时不会转换为 ./Just/Some/Dirs/ /Music 并给出了绝对路径。

如果有人遇到类似问题,请添加://这是脚本:

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

【问题讨论】:

  • 我不清楚这里的问题是什么。
  • 问题是如何从绝对路径中获取某个相对部分。就我而言, $BASE 以及如何创建它是相关部分。我之所以告诉我的意图是因为我不确定我的方法是否聪明,因为我相信总有更好的方法来做任何事情。

标签: bash path


【解决方案1】:

如果您的 Cuesheets 目录始终与您的音乐在同一目录中,您可以从路径中删除 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 字符串操作的更多信息,请参阅 bash docs

EDIT:// 将 ${$album_path#$root_dir} 更改为 ${album_path#$root_dir}

【讨论】:

  • 哦不,我完全忘记了 # 能够删除字符串。非常感谢,您为我节省了一个充满脚本的夜晚,以及当我意识到解决方案如此简单以及我以这种方式排序提示表的原因时的尴尬时刻。
  • 这应该是${album_path#$root_dir/}——album_path 上没有 $,并且在 $root_dir 之后有一个 /,因此它会删除分隔符并且不会被误认为是绝对路径。
【解决方案2】:

好的,我过去已经通过几种方式解决了这个问题。我不建议使用路径和 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

如果这是你可能经常做的事情,我实际上只是为此编写一个单独的脚本。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2020-04-28
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多