从输入文件创建目录

时间:2017-06-28 09:41:25

标签: unix awk scripting mkdir

我在输入文件中有下面提到的目录,我需要它们在循环中创建。

数据/ app_rt_ws /请求/ 2017_06_27
数据/ app_rt_ws /响应/ 2017_06_19
数据/ app_rt_ws / RTWS
数据/ app_rt_ws / SDP
数据/边缘/响应/ 2016年9月20日
data / edge / response / 9-22-2016

问题是我不需要在运行时在服务器上创建的yyyy_mm_dd或dd-mm-yyyy格式的目录。我需要将它们丢弃并创建目录的其余静态路径。

我使用下面提到的代码,但似乎无法弄清楚如何省略上述部分

for i in `cat /tmp/inputfile.txt`
do
echo $i
cd /opt/app/app
awk '/date_year/{print $1}' (need to filter out the entries with date)
mkdir -p $i ( need to create rest of the directories)
done

3 个答案:

答案 0 :(得分:0)

您可以使用bash字符串替换来删除日期。

for i in `cat /tmp/inputfile.txt`
do
echo $i
cd /opt/app/app
if [[ $i =~ [0-9] ]]; then
mkdir -p ${i%/*}
else
mkdir -p $i
fi
done

替换会在最后一次之后切断所有内容,因此日期消失了。

但是,如果您只想要所有没有数字的人,那么您可以这样做:

for i in `cat /tmp/inputfile.txt`
do
echo $i
cd /opt/app/app
if [[ $i =~ [0-9] ]]; then
:
else
mkdir -p $i
fi
done

第二版的输出:

data/app_rt_ws/RTWS
data/app_rt_ws/SDP

我希望这就是你寻找的东西:)

答案 1 :(得分:0)

您可以按照以下方式修改脚本,

for i in `awk '$0 !~ (/[0-9]{1,2}-[0-9]{1,2}-20[0-9]{2}/ && /20[0-9]{2}_[0-9]{1,2}_[0-9]{1,2}/){print}' inputfile.txt`;
do
  echo $i
  cd /opt/app/app
  mkdir -p $i
done

awk命令的输出是这样的,

$ awk '$0 !~ (/[0-9]{1,2}-[0-9]{1,2}-20[0-9]{2}/ && /20[0-9]{2}_[0-9]{1,2}_[0-9]{1,2}/){print}' inputfile.txt 
data/app_rt_ws/RTWS
data/app_rt_ws/SDP

答案 2 :(得分:0)

使用bash进行正则表达式匹配:

$ cat tst.sh
while IFS= read -r path; do
    if [[ $path =~ /([0-9]{4}(_[0-9]{2}){2}|([0-9]{1,2}-){2}[0-9]{4})$ ]]; then
        path="${path%/*}"
    fi
    echo mkdir -p "$path"
done < "$1"

$ ./tst.sh file
mkdir -p data/app_rt_ws/Request
mkdir -p data/app_rt_ws/Response
mkdir -p data/app_rt_ws/RTWS
mkdir -p data/app_rt_ws/SDP
mkdir -p data/edge/response
mkdir -p data/edge/response

在您测试后删除echo,并对结果感到满意。检查正则表达式 - 你说你想匹配dd-mm-yyyy但是你的输入包含日期为d-mm-yyyy所以idk你真正想要的,所以我猜你会对1或2位数感到满意,因此{ {1}}。

使用其他shell使用case语句或类似语句将行尾的日期匹配为globbing模式。您无需调用外部工具来执行此检查。

使用:

[0-9]{1,2}

始终要避免,因为当for i in `some command` 的输出包含空格并且使用不推荐的反引号而不是现代符号some command时,它会中断,并执行:

$(some command)
总是要避免

因为你应该总是引用你的shell变量(echo $i ),除非你有特殊的理由不这样做以避免意外的单词拆分和文件名生成。