【问题标题】:Bash run command with cd to each directory带有 cd 的 Bash 运行命令到每个目录
【发布时间】:2014-08-29 03:17:11
【问题描述】:

我有命令无法指定输出目标,因此输出文件保存在运行 bash 脚本的目录中。

find | xargs ipython nbconvert 

这会将每个子目录中的所有转换文件保存到命令运行的目录中。我想将转换后的文件输出到每个文件的当前目录。

那么如何指定一个没有输出目录选项的命令的目的地呢?

我想运行类似的东西

 find | convert . 

这样每个文件都保存在其目录中。

【问题讨论】:

    标签: python bash shell ipython


    【解决方案1】:

    find | xargs 无论如何都是一个坏主意,因为带有空格或其他不寻常字符的文件名可能会混淆问题。幸运的是 find 带有一个名为 -execdir 的标志,它几乎完全符合您的要求。

    find -execdir ipython nbconvert {} \;
    

    详情请查看find manpage


    正如@chepner 在 cmets 中指出的那样,并非所有版本的find 都支持-execdir 功能。对于那些不这样做的人,您可以利用输出在单独的行上这一事实,并创建一个 while 循环来遍历每个结果,在运行程序之前应用 cd

    find | while read line; do
      cd "$(dirname "$line")"
      ipython nbconvert "$line"
    done
    

    如果您希望它始终在其第一个参数的目录中运行,您也可以在 python 本身中实现这一点。如果您使用 sys.argv 而不是更高级的选项解析器之一,您可以在 python 脚本的开头添加类似这样的内容:

    if __name__ == '__main__':
        import os
        import os.path
        import sys
        os.chdir(os.path.dirname(sys.argv[1]))
    

    您还可以在open 时为输出文件指定显式路径,例如

    with open(os.path.join(os.path.dirname(sys.argv[1]), 'name_of_output_file.txt') as fb:
        pass # your code here
    

    【讨论】:

    • -execdir 不是 POSIX 标准的一部分,因此 find 的某些版本可能不支持它。但是,GNU find 和 Mac OS X(以及所有 BSD?)附带的版本可以。
    猜你喜欢
    • 2014-08-02
    • 2012-11-13
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多