我的脚本处理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/dir222
或dir2/dir22/dir222/new1.txt
$src
的起始前缀应为../../../../default
如果目的地为dir2/dir22
或dir2/dir22/new2.txt
$src
的起始前缀应为../../../default
如果目的地为dir2
或dir2/new2.txt
$src
的起始前缀应为../../default
问题是我不知道如何计算目录的深度。我该怎么办?我正在考虑正则表达式,但我不知道我将如何使用它。
答案 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