如何从文本文件创建包含子目录的多个目录?
How to create multiple directories with sub directories from text file?
#!/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
tabs/spaces 应该表示这是一个子目录。我怎样才能让它工作?
就我个人而言,我宁愿使用 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 "/" ; next }
{ parentdir = ; 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
#!/bin/bash -
function join { local IFS=""; 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
函数使用 </code> 分隔符 </li> 连接 <code> .. $*
个参数
sed
命令用 input.txt
文件中的斜杠替换制表符
sed
命令的输出通过 process substitution 重定向到 while
循环
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
#!/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
tabs/spaces 应该表示这是一个子目录。我怎样才能让它工作?
就我个人而言,我宁愿使用 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 "/" ; next }
{ parentdir = ; 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
#!/bin/bash -
function join { local IFS=""; 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
函数使用</code> 分隔符 </li> 连接 <code> .. $*
个参数sed
命令用input.txt
文件中的斜杠替换制表符sed
命令的输出通过 process substitution 重定向到 IFS
是 field separator${branch[@]:0:$level}
提取branch
数组项从0
到$level - 1
包含
while
循环
在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