如何在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