2016-11-27 213 views
0

晚上好,遍历目录和输出文件名到一个txt文件

我想写一个遍历目录中的所有文件,如果文件相匹配的正则表达式,它输出一个bash脚本文件名和一些额外的信息[使用猫]到一个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 

目录看起来像这样的文件:菲利克斯(1).JPG,菲利克斯(2).JPG,.....

如果你知道现有的脚本可以做这件事对我来说也毫不犹豫地提到这一点。

PS:这只是我的第二个职位,所以不要苛刻:)

+0

请看看:HTTP://www.shellcheck。net/ – Cyrus

回答

1

从原来的几个变化:

  • [周围的空间是至关重要的,因为[是一个shell内置和/或外部命令,因此shell需要空间来划分单词以便找到正确的命令。
  • 使用Cyrus'正则表达式语法是查找匹配文件的一种方法;下面,我使用case语句来使用常规模式匹配。脚本中的case语法使用周围的圆括号来分隔模式;由于(新)模式包含空格和括号,因此我使用\来逃脱它们。
  • 关于模式匹配文件名的主题​​,我已经采取了关于文件名的评论,并将其用作文件名需求的一部分;因此,名称类似于“felix.jpg”或“felixnon-matching.jpg”的文件将落入默认值4.
  • 您的$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" 
+0

非常感谢,我学到了一些东西:) 谢谢你最后的注意事项,我还不知道caffe如何处理这些标签文件。 我还有一些小问题; 1.我用两个下划线命名了一个脚本,它很长,并没有执行[我做了chmod u + x],所以我认为脚本的名字是有限制的? 2:是否#!/ usr/bin/env bash在每个脚本中都有要求?什么是最常见的环境,这到底做了什么?下划线 – Xilef

+0

应该没关系;你可能想编写一个关于Unix &Linux;的问题,并参见http://unix.stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-作为我的env问题的路径名称 –