Bash-从完整路径中提取每个较小的路径

Bash-从完整路径中提取每个较小的路径,bash,path,Bash,Path,我试图获取一个完整的路径目录,并从中提取每个路径。比如说 fullpath="/home/me/something/file" /home/me/something/file /home/me/something /home/me /home 我已经尝试过了,但是我还没有弄清楚如何把路径带出来 IFS=$'/' for i in $restorepath do echo $i

我试图获取一个完整的路径目录,并从中提取每个路径。比如说

fullpath="/home/me/something/file"

/home/me/something/file
/home/me/something
/home/me
/home
我已经尝试过了,但是我还没有弄清楚如何把路径带出来

IFS=$'/'
                for i in $restorepath
                do
                     echo $i
                      if [ -d $i ]; then
                        echo dir exists
                       fi

                done
                unset IFS
两个问题:

您正在测试一个目录,但看起来您正在提供一个文件 没有理由取消设置IFS,因为更改不会传播到父shell。如果要重新设置为默认值以便稍后在此脚本中使用,可以将旧值保存在某个变量中并在之后重置,或者将其更改为常见值,如IFS=$'\t\n' 试试这样的

#!/bin/bash
fullpath="/home/me/something/file"
IFS='/'
for i in $fullpath; do
    subpath+="$i/"
    if [[ -e $subpath ]]; then
      echo "$subpath"
    elif [[ -e ${subpath%?} ]]; then
      echo "${subpath%?}" && break
    else
      break
    fi
done

注意,${subpath%?}切掉最后一个字符?=bash中的单字符通配符,以防输入的是文件而不是目录。此外,如果子路径不存在,则可以安全地中断循环,因为这意味着它的后代不可能存在。

我已经有一段时间没有编写bash脚本了,这是一种完全不成熟且未经测试的方法,但在不知道您要做什么的情况下,我觉得您应该能够执行以下操作:

fullpath="/home/me/something/file
array=(${fullpath//// })
for i in "${!array[@]}"
do
    if i <= 4
        echo "$i=>${array[i]}"
done
for i in "${!array[@]}"
do
    if i <= 3
        echo "$i=>${array[i]}"
done
for i in "${!array[@]}"
do
    if i <= 2
        echo "$i=>${array[i]}"
done
for i in "${!array[@]}"
do
    if i <= 1
        echo "$i=>${array[i]}"
done

这可能会为您指明正确的方向。这是如何为路径创建所有必需的父目录的问题吗?如果是,请输入mkdir-p。