我有一个文件的显式路径:
/aaa/bbb/ccc/ddd/eee/fff.txt
Run Code Online (Sandbox Code Playgroud)
我需要cd /aaa/bbb
对ccc/ddd/eee/fff.txt
.
我弄明白了第一点:
df_test=/aaa/bbb/ccc/ddd/eee/fff.txt
cd $( echo ${df_test} | awk -F/ '{print "/"$2"/"$3}' )
Run Code Online (Sandbox Code Playgroud)
那么我如何切断路径中的前两个步骤,并对其余步骤进行操作?此外,我不会提前知道这些文件的深度。我可能有
/aaa/bbb/ccc/ddd.txt
/aaa/bbb/ccc/ddd/eee/fff.txt
/aaa/bbb/ccc/ddd/eee/fff/ggg/hhh/iii.txt
Run Code Online (Sandbox Code Playgroud)
我只需要将目录更改为/aaa/bbb,并在剩余的相对路径上进行操作。
在标准外壳中:
$ path=/aaa/bbb/ccc/ddd/eee/fff.txt
$ tail="${path#/*/*/}"
$ head="${path%/$tail}"
$ echo "$head" "$tail"
/aaa/bbb ccc/ddd/eee/fff.txt
Run Code Online (Sandbox Code Playgroud)
"${path#/*/*/}"
是path
但/*/*/
删除了(最短的)前导部分匹配的值,即您的尾部。然后"${path%/$tail}"
是path
用斜线和除去尾部。
如果路径没有足够的组件,这将产生损坏的结果,因此您可能需要先检查一下。
或者,在 Bash 中,我们可以使用正则表达式匹配[[ .. ]]
并选取匹配的部分:
$ if [[ $path =~ (/[^/]+/[^/]+)/(.*) ]]; then
echo "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
fi
/aaa/bbb ccc/ddd/eee/fff.txt
Run Code Online (Sandbox Code Playgroud)
[[ ... ]]
用作条件,因此使用if
here 来确保路径具有足够的组件很简单。