如何打印 Bash 中的所有父目录

How do I print all the parent directories in Bash

我有一个包含一些目录的文本文件。

例如

./dir1/dir2/dir3
./dir4/dir5

我想以包含所有子目录列表的文件文本结束:

.
./dir1
./dir1/dir2
./dir1/dir2/dir3
./dir4
./dir4/dir5

我试过这种方法,但是不行

cat folders_recently_used | xargs -I {} sh -c 'TEST={} ;
     while true; 
     do dirname $TEST; 
          if [ $(dirname $TEST) == '.' ]; 
             then break ; 
             else $TEST = $(dirname $TEST);
          fi  ; done' > folders_to_use

文件:

$ cat subdirs
./dir1/dir2/dir3
./dir4/dir5

脚本(有点丑,但工作正常):

#!/bin/bash

while read line
do
    counter=$(echo "${line}" | grep -o '/' | wc -l)
    i=1
    j=$(($i + 1))
    echo "Original string: ${line}"
    echo "Its parent directories:"
    while [ "${counter}" -gt 0 ]
    do
            echo "${line}" | cut -d'/' -f$i-$j
            counter=$(($counter - 1))
            j=$(($j + 1))
    done
    echo "Next one if exists..."
    echo ""
done < subdirs

输出:

Original string: ./dir1/dir2/dir3
Its parent directories:
./dir1
./dir1/dir2
./dir1/dir2/dir3
Next one if exists...

Original string: ./dir4/dir5
Its parent directories:
./dir4
./dir4/dir5
Next one if exists...

这是使用 bash 数组且没有外部子进程的另一种方法:

#!/bin/bash

while IFS='/' read -a path
do
    prefix=""
    for ((i=0; i < ${#path[@]}; i++))
    do
        echo "$prefix${path[i]}"
        prefix="$prefix${path[i]}/"
    done
done < folders_recently_used

对于提供的示例数据,这给出:

.
./dir1
./dir1/dir2
./dir1/dir2/dir3
.
./dir4
./dir4/dir5

IFS='/' 使内部字段分隔符成为 / 字符,以便它在 / 上拆分字符串。 read -a 将一个字段读入数组的每个元素,在这种情况下,数组称为 path

for ((i=0; i < ${#path[@]}; i++)) 遍历数组索引 (i)。 ${#path[@]} 给出数组中的元素数,在本例中为路径中的目录数。

剩下的只是字符串连接。