【问题标题】:run bash script over files that have not been converted对未转换的文件运行 bash 脚本
【发布时间】:2018-07-28 22:18:39
【问题描述】:

我有一个将 json 文件转换为 csv 的 python 脚本。它目前转换所有文件,但我希望它只在那些尚未转换为 csv 的 json 文件上运行。所有都在同一个目录中。如何修改我的代码:

#!/bin/bash
# file: foo.sh
for f in *.json; do
  python ~/bin/convert.py "$f" "-fcsv"
done

【问题讨论】:

  • 尚未转换为 csv 的文件 - 您希望如何验证此条件?甚至没有人看到您的 convert.py 内容
  • 我希望有一些 bash 条件循环,例如:for f in .json && !.csv;做
  • 显然您的 convert.py 文件应该将生成的文件重命名为 .csv
  • 也许问题是 OP 在很多大型 json 文件上运行它,每个文件都需要很长时间才能转换。所以他正在尝试优化运行时间,以便convert.py 仅在那些尚未转换的文件上运行。那是对的吗? IMO,最好更改 convert.py 程序,而不是在 convert.py 之上编写一个 bash 包装器(除非您不允许,或者不知道如何更改 convert.py 程序)

标签: python json shell csv


【解决方案1】:

假设您的脚本为名为 basename.json 的输入文件创建 basename.csv

for f in *.json; do
    test -e "${f%.json}.csv" && continue
    python ~/bin/convert.py "$f" "-fcsv"
done

shell 参数扩展 $(variable%pattern} 生成 variable 的值,并删除了 glob pattern 上的任何匹配项。

【讨论】:

    【解决方案2】:

    这利用了find GNU-util 并将python 用于 其余的部分。由于您正在运行 python 脚本,我假设 python 是 安装在系统上。

    下面的完整命令:

    find . \( -type f -regextype posix-extended -regex  '.*json' \) - exec python -c "import sys; import os; filename, file_extension = os.path.splittext(sys.argv[1]); if not os.path.isfile(filename + '.csv') : os.system('python ~/bin/convert ' + filename + file_extension + ' -fcsv')" {}
    

    搜索带有 .json 扩展名的文件

    find . \( -type f -regextype posix-extended -regex  '.*json' \)
    

    获取 find 命令的输出并将其输入 python 命名空间

    filename, file_extension = os.path.splittext(sys.argv[1]);
    

    检查是否有扩展名为 .csv 的文件名,如果没有则运行 convert.py 程序

    if not os.path.isfile(filename+'.csv'): os.system('python ~/bin/convert.py ' + filename+file_extension + ' -fcsv')" 
    

    您可以将整个脚本放入 bash 脚本中,然后使用 \ 将其分成多行,如下所示:How can I split a shell command over multiple lines when using an IF statement?

    【讨论】:

    • 如果答案没有回答问题,请留言说明为什么它不适合 OP 的问题
    猜你喜欢
    • 2015-05-27
    • 2023-04-02
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多