递归地将所有文件分类为单个文件

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 &gt; ./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 &gt; ../singlefilename

以上是关于递归地将所有文件分类为单个文件的主要内容,如果未能解决你的问题,请参考以下文章

递归地将所有文件合并到一个文件夹中

递归地将文件添加到所有目录

递归地将整个文件夹添加到存储库

递归地将所有第二层 mp3 转换为第三层并更新 ID3

sh 使用chown递归地将用户和组设置为文件

在PowerShell中递归地将一组文件从一个目录复制到另一个目录