找到文件后,如何将父目录名写入新文件?
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
我正在开发一个 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