如何打印 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[@]}
给出数组中的元素数,在本例中为路径中的目录数。
剩下的只是字符串连接。
我有一个包含一些目录的文本文件。
例如
./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[@]}
给出数组中的元素数,在本例中为路径中的目录数。
剩下的只是字符串连接。