我在输入文件中有下面提到的目录,我需要它们在循环中创建。
数据/ 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
答案 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
),除非你有特殊的理由不这样做以避免意外的单词拆分和文件名生成。