我将数千个 .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
.
感谢大家的帮助!