拆分 /path/to/file

daf*_*ydd 5 awk shell-script

我有一个文件的显式路径:

/aaa/bbb/ccc/ddd/eee/fff.txt
Run Code Online (Sandbox Code Playgroud)

我需要cd /aaa/bbbccc/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,并在剩余的相对路径上进行操作。

ilk*_*chu 9

在标准外壳中:

$ 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)

[[ ... ]]用作条件,因此使用ifhere 来确保路径具有足够的组件很简单。