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