链接Bash中目录内的目录

时间:2015-07-03 04:26:05

标签: regex bash symlink

我的脚本处理files.lst,它有一个看起来像这样的循环

while read src_column dest_column; do
    if [[ -d $src ]]; then
        src="../../default/$src_column/*"
    else
        src="../../default/$src_column"
    fi
    pushd $dest
    ln -s $src .
    popd
done < files.lst

FILES.LST

#~source~          ~destination~
data                dir1
default/def1.txt    new1.txt
data                dir2/dir22/dir222
default/def1.txt    dir2/dir22/dir222/new1.txt
default             dir2/dir22
default/def2.txt    dir2/dir22/ne2.txt

案件应该是这样的:

如果目的地为dir2/dir22/dir222dir2/dir22/dir222/new1.txt $src的起始前缀应为../../../../default

如果目的地为dir2/dir22dir2/dir22/new2.txt $src的起始前缀应为../../../default

如果目的地为dir2dir2/new2.txt $src的起始前缀应为../../default

问题是我不知道如何计算目录的深度。我该怎么办?我正在考虑正则表达式,但我不知道我将如何使用它。

1 个答案:

答案 0 :(得分:1)

使用sed计算路径......:

while read src_column dest_column; do
    if [[ -d $src ]]; then
        dest_column="$dest_column/"
    fi
    src_prefix="$(sed -r 's|/[^/]*$|/|; s|//*|/|g; s|[^/]+|..|g' <<< "./$dest_column")default"

# sed command details:
# First expression: strip out any file.txt from $dest_column
# 2nd expression: Change duplicate / to single / (e.g. a/b//c// to a/b/c
# Last expression: Change any path to `..`

#Finally append the missing ../default.

    if [[ -d $src ]]; then
        src="$src_prefix/$src_column/*"
    else
        src="$src_prefix/$src_column"
    fi
    pushd $dest
    ln -s $src .
    popd
done < files.lst
相关问题