我有一个包含〜2000个子目录的目录,并且每个子目录中都有2-10个txt文件。我想打开每个子目录,然后将内容合并或合并为一个文件,因此,我将拥有2000个目录,每个目录都有1个txt文件。我尝试使用Unix命令执行此操作,但似乎无法使命令在特定的子目录中执行,然后更改目录并再次执行该功能。
find . -maxdepth 1 -name "*.faa" -exec cat {}
有没有办法将其转换为bash脚本并使其在整个目录中运行,还是我应该寻找更类似于python的东西来尝试完成此任务。
谢谢你,如果这个问题我很抱歉。
这应该给您您想要的,并且可以根据您的需求进行定制:
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
子目录中。
所以
<OLD_BASE>
DIR_1
FILE_1
FILE_2
DIR_2
FILE_3
FILE_4
FILE_5
DIR_3
FILE_6
成为
<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()
包装功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句