我有多个文件 .txt,其中包含按字母顺序排序的人名,例如在主目录中,我有一个目录 a,其中包含一个 a.txt,其中包含以“a”开头的名称,例如“Anna”“Andrew”等。同样的事情在主目录中重复我有目录 b,其中包含 b.txt,其中包含名称等,直到 x、y、z。如何提取姓名并创建包含所有人姓名的 master.txt?
答案1
您可以通过使用来完成此操作猫命令和文件名扩展。如果所有这些文件都在源目录中/path/to/directory
,并且该目录中没有其他文件,那么最简洁的命令如下:
cat /path/to/directory/*/*.txt > master.txt
这将在当前目录中创建一个名为的文件master.txt
,其中包含源目录中所有文件的串联内容。笔记:这将包括源目录的任何子目录中的任何文件。
如果目录中有其他文件(或者如果您只是想更精确一点),那么您可以使用以下命令:
cat /path/to/directory/[a-z]/[a-z].txt > master.txt
这只会匹配源目录中的以下文件:
a/a.txt
a/b.txt
a/c.txt
.
.
.
z/x.txt
z/y.txt
z/z.txt
如果源目录中还有其他文件,或者您有类似的文件,但a/z.txt
子目录名称与文件的基本名称不匹配,并且您想要排除这些文件,那么您必须使用更精确的命令来缩小匹配文件列表。在这种情况下,您可以使用大括号扩展和一个for循环:
for letter in {a..z}; do \
cat "/path/to/directory/${letter}/${letter}.txt"; \
done >> master.txt
这将与您在问题中指定的文件完全匹配,而不是其他文件。
答案2
替换main_dir
为主目录的路径,将其保存在脚本中并从终端运行sh ./script-name.sh
#!/bin/bash
for i in $( cd main_dir && ls ); do
cat "main_dir/$i/$i.txt" >> "master.txt"
done