【发布时间】:2014-08-29 03:17:11
【问题描述】:
我有命令无法指定输出目标,因此输出文件保存在运行 bash 脚本的目录中。
find | xargs ipython nbconvert
这会将每个子目录中的所有转换文件保存到命令运行的目录中。我想将转换后的文件输出到每个文件的当前目录。
那么如何指定一个没有输出目录选项的命令的目的地呢?
我想运行类似的东西
find | convert .
这样每个文件都保存在其目录中。
【问题讨论】:
我有命令无法指定输出目标,因此输出文件保存在运行 bash 脚本的目录中。
find | xargs ipython nbconvert
这会将每个子目录中的所有转换文件保存到命令运行的目录中。我想将转换后的文件输出到每个文件的当前目录。
那么如何指定一个没有输出目录选项的命令的目的地呢?
我想运行类似的东西
find | convert .
这样每个文件都保存在其目录中。
【问题讨论】:
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?)附带的版本可以。