【问题标题】:With Linux shell commands, how can I edit a list of files fed through a pipestream into a CSV format?使用 Linux shell 命令,如何将通过管道流输入的文件列表编辑为 CSV 格式?
【发布时间】:2018-12-26 12:51:19
【问题描述】:

使用 Linux shell 命令,我如何递归搜索目录并将文件列表输出到两个值的 CSV 文件中;路径和文件?

例如,假设我有以下文件结构……

home/readme.txt.
home/web/fruit/grapes.pdf
home/web/animals/mammals/bears.gif

我想要一个带有输出的 CSV 文件……

home,readme.txt
home/web/fruit,grapes.pdf
home/web/animals/mammals,bears.gif

到目前为止,我最接近的是使用命令:

 find home -type f | sed ‘s/\//,/g’

但这并不完全正确,因为上述命令最终将所有正斜杠替换为逗号,而不仅仅是最后一个。

有人对我如何做到这一点有任何想法吗?

作为参考,我使用的是 Redhat Enterprise Linux 服务器。

提前致谢!

【问题讨论】:

    标签: linux shell file csv path


    【解决方案1】:

    您正在寻找以/ 结尾的最长前缀,您可以使用.*\/ 找到它。然后,您想使用该前缀,您可以使用 \(.*\)\/ 捕获并使用 \1 重播。

    所以,请将您的 sed 更新为 sed 's/\(.*\)\//\1,/'

    给予:

    find home -type f | sed 's/\(.*\)\//\1,/'
    

    【讨论】:

    • 像魅力一样工作!谢谢。
    【解决方案2】:

    您可以使用sed。由于正则表达式对这个工具很贪心,它会将最后出现的字符/替换为,

    sed 's#\(.*\)/\(.*\)#\1,\2#' file
    

    如果您需要对目录中的所有文件执行此操作,请使用:

    find -type f -exec sed 's#\(.*\)/\(.*\)#\1,\2#' {} \;
    

    【讨论】:

    • 感谢您的帮助。当我尝试这样做时,我收到错误消息“find:缺少对'-exec'的争论”我怀疑我打错了,但我设法让borrible的代码工作,所以我没有回去测试那个理论,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多