2016-05-10 97 views
1
#!/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 

的选项卡/空格都应该表明这是一个子目录。我怎样才能使这个工作?

+0

请更新与您的脚本有什么问题的问题。 – sjsam

回答

0

个人而言,我宁愿使用一个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文件与 - 代码 - 从-以上mkDir.txt

与内容的文件mkDir.txt

subdir 
dir1 
subdir 
dir2 
subdir 

将产生输出

mkdir ./subdir 
mkdir dir1 
mkdir dir1/subdir 
mkdir dir2 
mkdir dir2/subdir 
+0

这是完美的。简单,它的作品。谢谢。 –

0

使用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隔板
  • sed命令替换用斜杠凸片从input.txt文件
  • sed命令的输出重定向到$2 .. $*参数while循环通过的process substitution
  • IFS手段是field separator
  • ${branch[@]:0:$level}提取branch数组项从0$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 
相关问题