将多个子目录中的多个文件合并为每个子目录1个文件并删除原始文件

将多个子目录中的多个文件合并为每个子目录1个文件并删除原始文件

我有一个目录结构

DIR
        SUBDIR1
                    11-01-11.txt
                    13-05-23.txt

        SUBDIR2
                    12-05-56.txt
                    13-04-02.txt
                    15-04-06.txt

我想写一个 bash 脚本来实现这个所需输出

DIR
        SUBDIR1
                    sub_dir1_merged.txt

        SUBDIR2
                    sub_dir2_merged.txt

我想保留原始目录结构,将每个文件合并到一个 sub_dirname_merged.txt 文件中,并删除所有原始文件。

我尝试了以下方法代码

for f in */
do
cat $f/*.txt > "$f"/$f_merged.txt
rm $f/*.txt 
done

这并不能完全发挥作用。

答案1

剧本:

for f in */*.txt; do 
  cat "$f" >> "$(dirname "$f")/$(dirname "$f")_merged.txt" 
  rm "$f"
done

在子目录中循环 txt 文件:

for f in */*.txt; do 

$(dirname "$f")

返回 txt 所在文件夹的名称,该名称既用于命名文件又用于保存文件的路径。


rm "$f"

删除该文件。当您要使用rm命令时,请确保脚本的结果是您所期望的,然后再执行它。

答案2

您可以与标志find结合使用。-execdir它变得简单如下:

find DIR/ -type f -execdir bash -c 'cat -- $1 >> "${PWD##*/}_merged.txt"' _ {} \;

我稍微修改了上面的一行代码,因此原始文件被删除。

find DIR/ -type f -execdir bash -c 'for f; do cat -- $f >> "${PWD##*/}_merged.txt"; done;  [[ $f != *${PWD##*/}* ]] && rm -v "$f"' _ {} \;

相关内容