我有一个包含一些目录的文本文件。
例如
./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
答案 0 :(得分:3)
这是使用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[@]}
给出数组中元素的数量,在这种情况下,它是路径中的目录数。
其余的只是字符串连接。
答案 1 :(得分:1)
文件:
request.get(config.awsUserDataUrl)
.then((response) => {
const schema = joi.object().keys({
bucketname: joi.string().min(3).max(30).required(),
// alphanumeric string of 24 characters in length
jobid: joi.string().regex(/^[0-9a-fA-F]{24}$/),
appid: joi.string().min(3).max(30).required(),
snstopic: joi.string().min(3).max(60).required(),
filepath: joi.string().min(3).max(60).required(),
});
logger.info('response', JSON.stringify(response.body));
logger.info('response.body', response.body);
logger.info('response.status', response.status);
const result = joi.validate(response.body, schema);
if (result.error === null) {
logger.info('result', result);
resolve(response.body);
} else {
logger.info('result.error', result.error);
reject(result.error);
}
})
.catch((err) => {
logger.info('err.message', err.message);
logger.info('err.response', err.response);
// err.message, err.response
reject(err);
});
脚本(丑陋一点,但工作正常):
$ 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