如何在Bash

时间:2018-01-19 08:10:31

标签: 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; 
          if [ $(dirname $TEST) == '.' ]; 
             then break ; 
             else $TEST = $(dirname $TEST);
          fi  ; done' > folders_to_use

2 个答案:

答案 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