晚上好,
我想编写一个循环遍历目录中所有文件的bash脚本,如果文件与正则表达式匹配,它会将文件名和一些其他信息[使用cat]输出到txt文件。
该脚本将用于标记图像集,以便稍后创建一个用于caffe的LMDB。
这是我的尝试;
#!/bin/bash
for f in /absolutepath/train/*
do
if [$f == '/absolutepath/train/felix.*']
then $f cat ' 0' > train.txt
elif [$f == '/absolutepath/train/jonas.*']
then $f cat ' 1' > train.txt
elif [$f == '/absolutepath/train/joachim.*']
then $f cat ' 2' > train.txt
elif [$f == '/absolutepath/train/vriendinjoachim.*']
then $f cat ' 3' > train.txt
else $f cat ' 4' > train.txt
fi
echo "Done :D"
done
目录中的文件如下所示:felix(1).jpg,felix(2).jpg,.....
如果您知道可以为我执行此操作的现有脚本,请不要犹豫。
PS:这只是我的第二篇文章,所以不要苛刻:)
答案 0 :(得分:1)
与原作有一些变化:
[
周围的空间很关键,因为[
是shell内置命令和/或外部命令,因此shell需要空间来分隔单词以便找到正确的命令。case
语句来使用常规模式匹配。脚本中的case
语法使用周围的括号来分隔模式;由于(新)模式包含空格和括号,我已使用\
对其进行了转义。$f cat 3
的语法会尝试执行文件名而不是回显它;我用printf
替换了那一位。for
循环时,它都会覆盖train.txt
的先前内容,因此我已将单>
更改为>>
以追加新内容。echo Done
语句移到for循环之外,这样您只有在脚本完成后才会看到它(否则,您会在每个文件中看到它)。train.txt
的内容再次解析会很棘手;我不知道你是怎么做到的,我在循环中留下了两个printf
语句;一个首先打印文件名,然后是值;另一个(注释掉的)打印后跟文件名的值。我建议首先打印该值,因为它更容易说"对于每一行,首先读取整数值,然后读取其他所有内容作为文件名"而不是试图找到文件名的结尾,后跟一个整数。无论哪种方式,这些值都由标签\t
分隔,以帮助完成这些工作。这是新剧本:
#!/usr/bin/env bash
for f in /absolutepath/train/*
do
value=4
case "$f" in
( /absolutepath/train/felix\ \(*\).jpg )
value=0
;;
( /absolutepath/train/jonas\ \(*\).jpg )
value=1
;;
( /absolutepath/train/joachim\ \(*\).jpg )
value=2
;;
( /absolutepath/train/vriendinjoachim\ \(*\).jpg )
value=3
;;
(*)
value=4
;;
esac
#printf '%d\t%s\n' "$value" "$f" >> train.txt
printf '%s\t%d\n' "$f" "$value" >> train.txt
done
echo "Done :D"