找到文件后,如何将父目录名写入新文件?

After finding a file, how to write parent directory name to new file?

我正在开发一个 bash 脚本,该脚本在子目录中搜索文件的每个实例,然后将每个实例的内容连接到一个文件中。在写每个文件的时候,我想先在内容前写上每个父目录的名字,即

Find: path/to/parentdir/file.txt
Write:
parentdir
<contents of file>

到目前为止,我可以找到文件并获取它们的内容,但我在提取目录名时遇到了问题。最佳尝试:

find . -type f -name file.txt -exec echo "$(dirname {})" \; -exec cat {} \; >> bigfile.txt

但这只会导致很多 '.'s。

非常感谢任何建议。

假设:

  • OP 示例输出的前两行(Find: ...Write: ...)实际上并不是写入 bigfile.txt
  • 的内容的一部分
  • OP 不要求在父目录名称前加上任何特殊的 strings/patterns 以使它们从 bigfile.txt
  • 中的其余文本中脱颖而出

如果这些假设是错误的,我们可以返回并在答案中添加一些代码。


UPDATE:在意识到 dirname(由 OP 引用)没有提供所需的输出(即 dirname 提供整个目录结构后重新访问而 OP 只需要直接父目录的名称)。

一个 awk 解析文件名以及 cat 文件的想法:

awk '
BEGIN { n=split(ARGV[1],arr,"/")        # split name of input dir/file by "/"; put contents in array arr[]
        print arr[n-1]                  # print next-to-last element from arr[]
      }
1                                       # pass all input lines to stdout
' path/to/dir/filename

将其放入 OP 的 find 命令中:

find . -type f -name file.txt -exec awk 'BEGIN {n=split(ARGV[1],arr,"/"); print arr[n-1]}1' {} \; >> bigfile.txt

基于假设 dirname 的先前答案提供了 OP 想要的内容...

无需调用子流程调用dirname,也无需echo表示结果;直接调用dirname即可,例如:

find . -type f -name file.txt -exec dirname {} \; -exec cat {} \; >> bigfile.txt

[添加@oguzismail 的评论...]

使用 GNU find,您可以使用 -printf 选项来消除 dirname 调用,例如:

find . -type f -name file.txt -printf '%h\n' -exec cat {} \; >> bigfile.txt