我有很多文件的文件夹,每个文件夹都有同名的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
发布于 2022-01-20 14:09:53
您可以使用这个:
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 \;
它所做的:
xargs
阅读此列表find
,并扫描parent
以查找具有该名称的文件注意:输出文件中的数据不一定按FOLDER1、FOLDER2等的名称排序,而是按find
检索文件的方式排序。
Note2:绝对路径是正确过滤合并目录的必要条件。
发布于 2022-01-20 17:01:58
使用zsh
:
cd /home/parent && mkdir -p Merged || exit
typeset -A files
for file (Folder*/*.txt(nN)) files[$file:t]+=$file注意,n glob限定符将数字排序应用于glob展开,例如,Folder2在Folder10之前,txtfile1.txt在txtfile10.txt之前。请注意,隐藏的文件被跳过。如果希望它们也合并,请添加D glob限定符。\0'
for file (${(k)files}) cat -- ${(0)files[$file]} > Merged/$file
注意,D2
glob限定符将数字排序应用于glob展开,例如,D3
在D4
之前,D5
在D6
之前。
请注意,隐藏的文件被跳过。如果希望它们也合并,请添加D7
glob限定符。
https://unix.stackexchange.com/questions/687192
复制相似问题