在 Bash 中的目录中链接目录
Linking directories inside directories in Bash
我的脚本处理 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
问题是我不知道如何计算目录的深度。我应该采取什么方法?我正在考虑正则表达式,但我不知道如何使用它。
使用sed
计算路径...:[=12=]
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
我的脚本处理 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
问题是我不知道如何计算目录的深度。我应该采取什么方法?我正在考虑正则表达式,但我不知道如何使用它。
使用sed
计算路径...:[=12=]
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