我有最初包含不同目录路径的字符串,其中第二个和最后第二个子目录的长度可以不同,如下所示
/home/Leo/Work/CMI/ARCH/MWS/Disks
/home/Cleo/Work/CMI/ARCH/BK/Disks
Run Code Online (Sandbox Code Playgroud)
我想修剪前 5 个子目录,只显示最后 2 个,就像这样
echo "/MWS/Disks"
echo "/BK/Disks"
Run Code Online (Sandbox Code Playgroud)
从初始字符串中修剪前 5 个子目录的一种方法可能是将每个字符左移,直到两个字符串都以倒数第二个“/”开头。
Bash初学者指南描述了一种shift built-in左移命令中的位置参数并丢弃未使用的参数的方法。但是否可以使用此方法从上述字符串中删除前 5 个子目录还不是很明显。
在 Bash 中,如何减少这些字符串,最好不使用循环?
澄清
从评论来看,需要更多的背景信息。我的 Bash 脚本从 8 英寸软盘映像中恢复历史 Mdos 和 Qdos 文件,并将文件保存到硬盘驱动器上的目录中。
无论好坏,我创建了一个定制方案,使用 3 字符变量名称存储目录路径,其中每个名称都是当前目录路径部分的首字母缩写词。
例如以下路径中MWC的缩写$MY/Work/CMI
MY="$USER"
MWC="C:/cygwin64/home/$MY/Work/CMI"
cd "$MWC"
pwd
C:/cygwin64/home/$MY/Work/CMI
Run Code Online (Sandbox Code Playgroud)
同样,3 字符变量指向树上的下一个子目录
WCA="$MWC/ARCH"
Run Code Online (Sandbox Code Playgroud)
即C:/cygwin64/home/$MY/Work/CMI/ARCH,档案所有者画廊的路径。
由于目录路径加长了 3 个字符的变量,因此可以通过保留列表中的空白来轻松识别路径。尽管如此,每当我的脚本引用路径时,就会出现完整路径。因此需要修剪最终用户不感兴趣的字符串部分。
如果子目录的数量始终相同,则可以使用参数扩展来删除前 5 个子目录:
s=/home/Leo/Work/CMI/ARCH/MWS/Disks
s=/${s#/*/*/*/*/*/}
echo $s # /MWS/Disks
Run Code Online (Sandbox Code Playgroud)
或者,如果您知道无论路径的深度如何,您都需要最后两部分:
s=/home/Leo/Work/CMI/ARCH/MWS/Disks
last=/${s##*/}
last_but1=${s%$last}
last_but1=/${last_but1##*/}
echo $last_but1$last # /MWS/Disks
Run Code Online (Sandbox Code Playgroud)
${s#PATTERN}从 的开头删除 PATTERN $s。${s%PATTERN}从 的末尾删除 PATTERN $s。#或%,找到 PATTERN 的最短匹配。将它们加倍可以使比赛时间尽可能长。