循环遍历目录并将文件名输出到txt文件

时间:2016-11-27 18:15:03

标签: bash caffe

晚上好,

我想编写一个循环遍历目录中所有文件的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:这只是我的第二篇文章,所以不要苛刻:)

1 个答案:

答案 0 :(得分: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"