我有很多文件的文件夹,每个文件夹都有同名的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
例子。
请注意,隐藏文件将被跳过。如果您也希望将它们合并,请添加D
glob 限定符。