递归地将所有文件分类为单个文件
Posted
技术标签:
【中文标题】递归地将所有文件分类为单个文件【英文标题】:Recursively cat all the files into single file 【发布时间】:2014-07-26 23:26:30 【问题描述】:我有一堆文件放在类似的文件夹中
data\A\A\A\json1.json
data\A\A\A\json2.json
data\A\A\B\json1.json
...
data\Z\Z\Z\json_x.json
我想将所有的 jsons 集中到一个文件中?
【问题讨论】:
结果不是有效的 JSON,你确定要这样做吗? 【参考方案1】:find data/ -name '*.json' -exec cat \; > uber.json
简短说明:
find <where> \
-name <file_name_pattern> \
-exec <run_cmd_on_every_hit> \; \
> <where_to_store>
【讨论】:
不使用 find:cat ./data/*/*/*/*.json > ./all.json
或者在bash
4 和shopt -s globstar
, cat ./data/**/*.json
。
您还应该添加“-type f”(仅限文件)以避免 cat 尝试打印目录时出错。
什么是\;在做什么?
@rwitzel ;
结束 exec
命令。您需要使用 `` 对其进行转义,否则它将结束整个命令。更多信息:askubuntu.com/questions/339015/…【参考方案2】:
使用find
获取所有 JSON 文件并将它们连接起来。
find data -name '*.json' -exec cat + > all.json
请注意,这不是有效的 JSON。如果您希望 JSON 文件包含多个对象,则它们需要位于包含数组或对象中,因此您需要在它们周围添加 [ ]
并在每个对象之间添加 ,
。
【讨论】:
完全正确,但如果目录带有.json
扩展名,那就太不正常了。
如何在上述命令中的每个文件之间添加“,”字符?
@GalBracha 使用仅打印文件名的find
命令,将其传送到读取每个文件名的脚本,cat "$filename"; echo ','
。
您必须在完成后编辑文件以删除最后一个 ,
@rwitzel 如果以+
而不是;
结束-exec
选项,它将用所有文件名替换
,而不是为每个文件名单独运行命令。【参考方案3】:
或者——如果你有你的文件列表——你可以把它传送到xargs
<path to your files> | xargs cat > all.json
【讨论】:
递归获取列表:find `pwd`【参考方案4】:find ./ -type f | xargs cat > ../singlefilename
我想要这个,简单易懂。
../
避免错误input file is output file
。
【讨论】:
find ./ -type f | fgrep -v singlefilename | xargs cat > ../singlefilename
以上是关于递归地将所有文件分类为单个文件的主要内容,如果未能解决你的问题,请参考以下文章