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

时间:2014-06-26 00:19:31

标签: 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
                      if [ -d $i ]; then
                        echo dir exists
                       fi

                done
                unset IFS

2 个答案:

答案 0 :(得分:0)

几个问题:

  • 您正在测试目录,但看起来您正在提供文件
  • 没有理由unset 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中的? =单字符通配符),以防您输入文件而不是目录作为输入。如果子路径不存在,那么打破循环也是安全的,因为这意味着它不存在后代。

答案 1 :(得分:0)

自从我做了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