首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何合并子目录中的文件并在多个子目录上执行此功能

如何合并子目录中的文件并在多个子目录上执行此功能
EN

Stack Overflow用户
提问于 2015-03-10 21:01:07
回答 2查看 1.7K关注 0票数 1

我有一个带有~2000子目录的目录,在每个子目录中有2-10个txt文件.我想打开每个子目录,并将内容合并或连接到一个文件中,因此我将有2000个目录,每个目录都有1个txt文件。我尝试过使用unix命令来完成这个任务,但是我似乎无法让命令在特定的子目录中执行,然后更改目录并再次执行该函数。

代码语言:javascript
复制
find . -maxdepth 1 -name "*.faa" -exec cat {} 

是否有一种方法可以将其转换为bash脚本并让它在整个目录中运行,或者我应该使用类似python的方法来尝试并完成此任务。

谢谢,如果有人问了,我很抱歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-10 21:31:14

这应该给你想要的东西,并且可以根据你的需要定制:

代码语言:javascript
复制
import os

OLD_BASE = '/tmp/so/merge/old'
NEW_BASE = '/tmp/so/merge/new'
NEW_NAME = 'merged.txt'

def merge_files(infiles, outfile):
    with open(outfile, 'wb') as fo:
        for infile in infiles:
            with open(infile, 'rb') as fi:
                fo.write(fi.read())


for (dirpath, dirnames, filenames) in os.walk(OLD_BASE):
    base, tail = os.path.split(dirpath)
    if base != OLD_BASE: continue  # Don't operate on OLD_BASE, only children directories

    # Build infiles list
    infiles = sorted([os.path.join(dirpath, filename) for filename in filenames])

    # Create output directory
    new_dir =  os.path.join(NEW_BASE, tail)
    os.mkdir(new_dir)  # This will raise an OSError if the directory already exists

    # Build outfile name
    outfile = os.path.join(new_dir, NEW_NAME)

    # Merge
    merge_files(infiles, outfile)

最终的结果是,对于OLD_BASE中的每个目录,都会在NEW_BASE中创建同名目录。在每个NEW_BASE子目录中,创建一个名为merged.txt的文件,并在相应的OLD_BASE子目录中连接文件的内容。

所以

代码语言:javascript
复制
<OLD_BASE>
    DIR_1
        FILE_1
        FILE_2
    DIR_2
        FILE_3
        FILE_4
        FILE_5
    DIR_3
        FILE_6

化作

代码语言:javascript
复制
<NEW_BASE>
    DIR_1
        <NEW_NAME> (=FILE_1 + FILE_2)
    DIR_2
        <NEW_NAME> (=FILE_3 + FILE_4 + FILE_5)
    DIR_3
        <NEW_NAME> (=FILE_6)

我知道您说过,合并文件的顺序并不重要,但这是按文件名(区分大小写的)字母顺序合并的,以防将来的查看者感兴趣。如果您真的不是,您可以删除sorted()包装函数。

票数 1
EN

Stack Overflow用户

发布于 2015-03-10 22:55:17

如果我理解正确,这就可以做到:

代码语言:javascript
复制
find -maxdepth 1 -type d -exec sh -c 'cd "$0" && cat *.faa > bigfile' {} \;

它查找当前目录中的所有子目录(非递归),将cd连接到当前目录中,并将所有*.faa文件连接到一个名为bigfile的文件中(子目录中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28974007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档