我在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
如果helloworld
和letter
是Type A
个文件,document-1
是Type B
个文件。
我想也许我可以先编写一个files.list.tmp
文件,然后再使用另一个bash脚本逐行处理它...但这会产生额外的文件而我真的不会我想这样做。
我可以使用>>
运算符创建变量吗?
我不确定我应该在这做什么。
顺便说一下,当调用这个bash脚本时,它已经知道匹配正则表达式的文件是A类型还是B类,因为它是作为脚本的参数给出的。
答案 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
在上面的代码中,选项如下
您可以根据需要添加任意数量的 * 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