连接txt文件并保留目录名称

连接txt文件并保留目录名称

我将数千个 .txt 文件连接在一起,但我想将路径写在每个 .txt 文件的文本上方,以便我可以在需要时返回目录以查看文件。

例子:

file1.txt 的内容如下:

id: 1234
info: 1234
id: abcd
info: abcd

file1.txt的路径是pathto/dir1/sub1/file1.txt

file2.txt 的内容如下:

id: 5678
info: 5678

file2.txt的路径是pathto/dir2/sub2/file2.txt

连接后的 .txt 文件的格式应如下所示:

pathto/dir1/sub1/file1.txt

id: 1234
info: 1234
id: abcd
info: abcd

pathto/dir2/sub2/file2.txt

id: 5678
info: 5678

单独连接不会打印每个连接的 .txt 文件之间的路径,这正是我想要实现的目标。

我还将 cd ~/ 进入pathto/并需要从那里运行一个命令,该命令将递归扫描所有子目录以查找“file.txt”文件

答案1

听起来你的 shell 可以开箱即用:

#!/bin/bash
shopt -s globstar nocaseglob nullglob

for file in **/file.txt **/files.txt; do
  printf '---------------------\n' >> allfiles.txt
  printf '%s' "${file}" >> allfiles.txt
  printf '---------------------\n' >> allfiles.txt
  cat "${file}" >> allfiles.txt
done

答案2

循环到目录级别,循环每组子目录,循环文件。像这样的东西

for topdir in */
do
    top=${topdir%/}
    top=${top##*/}

    for subdir in "$topdir"/*/
    do
        sub=${subdir%/}
        sub=${sub##*/}

        printf -- '-%s\n--%s\n\n' "$top" "$sub"

        for file in "$subdir"/*
        do
            [ -f "$file" ] && cat <"$file"
        done
    done
done >output_file

我在文件之间使用了显式循环来确保我只是尝试连接文件。如果您确定每个子目录中只有文件,则可以省略它。


为了回答您修改后的问题,我可以提供这个明显更短的解决方案。这会从当前目录中搜索调用的文件,file.txt并将它们与其路径名连接到output_file.

find . -type f -name 'file.txt' -exec sh -c 'for f in "$@"; do printf "%s\n\n" "${f#./}"; cat "$f"; echo; done' _ {} + >output_file

答案3

根据您的问题和评论,您似乎正在进入该文件夹,然后执行以下操作:

cat filename* > concatenatedfile.txt

基本上只是在所有以filename.

您可以pwd先使用命令,然后运行cat将路径放在文件顶部,然后将串联附加到文件。

pwd > concatenatedfile.txt
cat filename* >> concatenatedfile

这样,您将创建包含您所在文件夹路径的 concatenatedfile.txt,然后>>只需将以文件名开头的所有文件的内容附加到同一文件即可。

>覆盖文件的内容

>>追加到文件末尾,文件顶部的内容保持不变

答案4

最终效果如下:

find . -type f -iname 'file.txt' -printf '\n%P\n'  -exec cat {} \; > catfile.txt

查找所有标题(无论大小写)的文件file.txt,并将数据打印到名为catfile.txt.

感谢大家的帮助!

相关内容