【问题标题】:How to create multiple directories with sub directories from text file?如何使用文本文件中的子目录创建多个目录?
【发布时间】:2016-05-10 15:21:07
【问题描述】:
#!/bin/bash
prev='placeholder'
filename='mkDir.txt'
echo "Starting mkDir script using mkDir.txt."
while IFS=' ' read line || [[ -n "$line" ]]; do
    echo "creating dir : $line"
    if [[ ${line:0:1} == [[:space:]] ]]
    then
        cd $prev
        mkdir $line
        cd '..'
    else
        mkdir $line
    fi
    prev=$line
done < $filename

这是我当前的脚本。然而,它并没有按照我的意愿创建子目录。我理想的文本文件应该是这样的:

tester
    test
test2

制表符/空格应该表明这是一个子目录。我怎样才能让它工作?

【问题讨论】:

  • 请用您的脚本有什么问题更新问题。

标签: bash shell unix scripting subdirectory


【解决方案1】:

我个人更愿意使用 AWK 程序从输入文件生成 bash 脚本,然后运行 ​​bash 脚本:

#!/bin/awk
# WARNING: this example assumes there are is no whitespace in the directory names!
BEGIN { parentdir = "." }
/^[[:space:]]*$/ { next }
/^[[:space:]]/ { print "mkdir " parentdir "/" $1; next }
{ parentdir = $1; print "mkdir " parentdir }

AWK 是这样调用的:awk -f file-with-code-from-above mkDir.txt

包含内容的文件 mkDir.txt

 subdir
dir1
 subdir
dir2
 subdir

会产生输出

mkdir ./subdir
mkdir dir1
mkdir dir1/subdir
mkdir dir2
mkdir dir2/subdir

【讨论】:

    【解决方案2】:

    使用Bash arrays

    #!/bin/bash -
    
    function join { local IFS="$1"; shift; echo "$*"; }
    
    branch=()
    while IFS=/ read -r -a parts; do
        level=${#parts[@]}
        branch=( ${branch[@]:0:$level} )
    
        (( --level ))
    
        branch[$level]="${parts[$level]}"
    
        mkdir -p $(join / "${branch[@]}")
    done < <(sed -e 's~\t~/~g' input.txt)
    
    • join 函数使用 $1 分隔符连接 $2 .. $* 参数
    • sed 命令用 input.txt 文件中的斜线替换制表符
    • sed 命令的输出通过process substitution 重定向到while 循环
    • IFSfield separator
    • ${branch[@]:0:$level}0 提取 branch 数组项到 $level - 1 包含

    在 PHP 中

    <?php
    $branch = [];
    $fp = fopen('php://stdin', 'r');
    
    while ($line = fgets($fp)) {
      $parts = explode("\t", $line);
      $level = count($parts);
      $branch = array_slice($branch, 0, $level);
      $branch[$level - 1] = trim($parts[$level - 1]);
    
      mkdir(implode('/', $branch), 0755, true);
    }
    
    fclose($fp);
    

    用法:

    php script.php < input.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      相关资源
      最近更新 更多