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

如何在Bash中打印所有父目录,bash,directory,subdirectory,Bash,Directory,Subdirectory,我有一个包含一些目录的文本文件 比如说 ./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;

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

比如说

./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
文件:

脚本(有点难看,但效果很好):

文件:

脚本(有点难看,但效果很好):


下面是另一种使用
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
IFS='/'
将内部字段分隔符设置为
/
字符,以便它拆分
/
上的字符串
read-a
将一个字段读入数组的每个元素,在这种情况下,该数组称为
path

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


剩下的只是字符串连接。

下面是另一种使用
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
IFS='/'
将内部字段分隔符设置为
/
字符,以便它拆分
/
上的字符串
read-a
将一个字段读入数组的每个元素,在这种情况下,该数组称为
path

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


剩下的只是字符串连接。

完美它工作得很好!出于某种原因,我删除了每一个不是目录的echo(并改为放置done>subdirs,它在我的脚本中不起作用,
grep-o
是POSIX的一个扩展,并且不是在所有平台上都可用。非常好,它工作得很好!出于某种原因,我删除了每一个不是目录的echo(而将done>subdirs放在这里,它在我的脚本中不起作用,
grep-o
是POSIX的扩展,不能在所有平台上使用。
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...
#!/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