在转储到文件之前,在bash脚本中处理从find命令获取的字符串

时间:2016-12-20 11:52:05

标签: linux string bash shell find

我在shell(bash)脚本中使用find命令来获取与模式匹配的文件列表,并将这些文件名转储到文本文件中。

find ./ -type f -name *.txt >> files.list

生成包含

的文件
helloworld.txt
letter.txt
document-1.txt
document-1.backup.txt

find命令并不重要。我实际使用的那个包含正则表达式,并生成一个合理的匹配文件列表,用作程序的输入文件。

我想用标记标记每个文件名,以标记它是Type A文件还是Type B文件。即,我希望输出文件files.list看起来像这样

helloworld.txt type=A
letter.txt type=A
document-1.txt type=B
document-1.backup.txt type=B

如果helloworldletterType A个文件,document-1Type B个文件。

我想也许我可以先编写一个files.list.tmp文件,然后再使用另一个bash脚本逐行处理它...但这会产生额外的文件而我真的不会我想这样做。

我可以使用>>运算符创建变量吗?

我不确定我应该在这做什么。

顺便说一下,当调用这个bash脚本时,它已经知道匹配正则表达式的文件是A类型还是B类,因为它是作为脚本的参数给出的。

3 个答案:

答案 0 :(得分:0)

  

我想也许我可以先写一个files.list.tmp文件,然后用另一个bash脚本逐行处理它来读回来......但这会产生额外的文件,我真的不知道想要那样做

您可以使用process substitution

来避免创建临时文件
./ascript.sh < <(find . -type f -name '*.txt')

让你的脚本逐行读取文件名。

答案 1 :(得分:0)

您可以管理包含以下选项的案例

find . -name '*.txt' | while read f; do type=UNKNOWN; case $f in *hello*) type=A;; *letter*) type=A;; *document*) type=B;; esac; echo $f type=$type; done

在上面的代码中,选项如下

  • * hello *:type = A
  • * letter *:type = A
  • * document *:type = B
  • 默认值:type = UNKNOWN

您可以根据需要添加任意数量的 * PATTERN *)type = TYPE ;; 条目。给定您的文件输出为:

./document-1.backup.txt type=B
./document-1.txt type=B
./letter.txt type=A
./helloworld.txt type=A

答案 2 :(得分:0)

  

顺便说一句,当调用此bash脚本时,它已经知道与正则表达式匹配的文件是A类型还是B类型,因为这是脚本的自变量。

因此,由于您的find命令每次调用仅转储一种给定类型的文件名,因此只需将type=…标记附加到每个输出行即可;这可以通过sed完成,例如g。:

find ./ -type f -name *.txt | sed "s/$/ type=$type/" >>files.list