所以我有一个包含数千个子目录的文件系统
304880.US
906T89.DE
032848.UK
023455.UKREGRESS
:
有时文件夹内还有其他名为1
、2
和的文件夹3
。
每个最终目录都包含各种文本文件,其中output.txt
.
.UK
我想找到名称中任意位置的所有目录,并将其所有output.txt
文件合并到一个主文件中。顺序并不重要。
例子:
├── 032848.UK
│ ├── corrupted.txt
│ ├── errors.txt
│ ├── notfound.txt
│ ├── output.txt
│ └── rejected.txt
├── 135411.UK
│ ├── 1
│ │ ├── corrupted.txt
│ │ ├── errors.txt
│ │ ├── notfound.txt
│ │ ├── output.txt
│ │ └── rejected.txt
│ ├── 2
│ │ ├── corrupted.txt
│ │ ├── errors.txt
│ │ ├── notfound.txt
│ │ ├── output.txt
│ │ └── rejected.txt
│ └── 3
│ ├── corrupted.txt
│ ├── errors.txt
│ ├── notfound.txt
│ ├── output.txt
│ └── rejected.txt
├── 304880.US
│ ├── corrupted.txt
│ ├── errors.txt
│ ├── notfound.txt
│ ├── output.txt
│ └── rejected.txt
├── 906T89.DE
│ ├── corrupted.txt
: :
└── ...
答案1
(f 假设合并是串联的。)
连接
你可以做这样的事情(寻找):
find . -wholename '*.UK*/*output.txt' -exec cat {} >>concatenated.UK.txt +
或通过全球定位:
cat *.UK*/*{output.txt,/output.txt} >concatenated.UK.txt
或者更具体地说:
cat *.UK*/{output.txt,[123]/output.txt} >concatenated.UK.txt
列表
至于find,你可以通过以下方式查看它找到了什么:
find . -wholename '*.UK*/*output.txt'
对于 glob 例如:
printf '%s\n' *.UK*/{output.txt,[123]/output.txt}
答案2
我从条件出发——合并意味着串联。生成的文件应放置在目录中*.UK/
:
find -path '*.UK/[123]/output.txt' -exec bash -c 'cat $0 >>${0%/*}/../output.txt' {} \;
您可以添加这样的路径:
\( -path '*.UK/[123]/output.txt' -o -path '*.UKREGRESS/[123]/output.txt' \)
但生成的文件将分别放置在其自己的父目录中。