Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 找到文件后,如何将父目录名写入新文件?_Bash_Find - Fatal编程技术网

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

Bash 找到文件后,如何将父目录名写入新文件?,bash,find,Bash,Find,我正在编写一个bash脚本,它在子目录中搜索文件的每个实例,然后将每个实例的内容连接到单个文件。在写入每个文件时,我首先要在内容之前写入每个父目录的名称,即 Find: path/to/parentdir/file.txt Write: parentdir <contents of file> 但是这只会导致很多的错误 非常感谢您的建议。假设: OP示例输出的前两行(Find:…和Write:…)实际上不是写入bigfile.txt的内容的一部分 OP不需要在父目录名前面加上任何

我正在编写一个bash脚本,它在子目录中搜索文件的每个实例,然后将每个实例的内容连接到单个文件。在写入每个文件时,我首先要在内容之前写入每个父目录的名称,即

Find: path/to/parentdir/file.txt
Write:
parentdir
<contents of file>
但是这只会导致很多的错误

非常感谢您的建议。

假设:

  • OP示例输出的前两行(
    Find:…
    Write:…
    )实际上不是写入
    bigfile.txt的内容的一部分
  • OP不需要在父目录名前面加上任何特殊的字符串/模式,以使它们在
    bigfile.txt
如果这些假设是错误的,我们可以回来给答案添加一些代码


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

一个
awk
idea解析文件名以及
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

谢谢你的回复。“-printf”解决方案几乎拥有它,但它正在打印整个目录结构;我只需要父目录的名称。好的,
dirname
不会返回您想要的,对吗?我已经更新了另一个答案,我相信它与您的示例输出相匹配…就是这样,非常感谢!我将进一步研究您的解决方案,并确保更加熟悉awk命令。
find . -type f -name file.txt -printf '%h\n' -exec cat {} \; >> bigfile.txt