如何合并所有子目录中同名的txt文件

如何合并所有子目录中同名的txt文件

我有很多文件的文件夹,每个文件夹都有同名的txt文件,我想将所有子目录中的所有txt文件合并到一个文件夹中。

例子:

/home/parent/Folder1 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder2 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder3 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt

我想将所有具有相同名称的文件合并到不同的文件夹中。

/home/parent/Merged ===> txtfile1.txt, txtfile2.txt, txtfile3.txt

答案1

你可以使用这个:

mkdir "/home/parent/MERGED"
find "/home/parent/Folder1" -type f -name '*txt' -printf '%f\0' | 
xargs -0 -I FILENAME find "/home/parent" ! -path '/home/parent/MERGED/*' \
-type f -name FILENAME\
-exec sh -c 'cat "$1" >> "/home/parent/MERGED/$2"' sh {} FILENAME \;

它能做什么:

  • 创建目标目录
  • 扫描 FOLDER1 并打印文件名(不带路径),后跟 NUL 作为分隔符
  • 阅读此列表xargs
  • find每个输入名称运行一次并扫描parent具有该名称的文件
  • 从此搜索中排除目标目录
  • 将结果连接到 MERGED 中具有给定名称的文件中

注意:输出文件中的数据不一定按 FOLDER1、FOLDER2 等名称排序,而是按find检索文件的方式排序。

注意2:绝对路径是正确过滤合并目录所必需的。

答案2

zsh

cd /home/parent && mkdir -p Merged || exit
typeset -A files
for file (Folder*/*.txt(nN)) files[$file:t]+=$file$'\0'
for file (${(k)files}) cat -- ${(0)files[$file]} > Merged/$file

请注意n将数字排序应用于 glob 扩展的 glob 限定符,如下Folder2所示 Folder10以及txtfile1.txt之前的txtfile10.txt例子。

请注意,隐藏文件将被跳过。如果您也希望将它们合并,请添加Dglob 限定符。

相关内容