我想在目录中运行脚本,以便为每个找到的点文件生成svg文件。类似的东西:
find . -name "*.dot" -exec dot -Tsvg \{} \;
这很好但只是在stdout上输出结果。通常我使用重定向来生成svg文件。如何获取点文件名以在重定向中使用它,如
find . -name "*.dot" -exec dot -Tsvg > "$dotfilename".svg \{} \;
答案 0 :(得分:5)
您不需要输出重定向。使用-O保存到从输入文件名和输出格式自动创建名称的文件。
find . -name "*.dot" -exec dot -Tsvg -O \{} \;
只是要指出你可以在-exec:
的参数中多次使用{}find . -name "*.dot" -exec dot -Tsvg -o \{}.svg \{} \;
第一个会从“foo.dot”产生“foo.svg”,第二个会产生“foo.dot.svg”
答案 1 :(得分:4)
以下内容:
for i in `find . -name "*.dot"`; do
dot -Tsvg $i > $i.svg
done
执行查找(在反引号中)并循环结果,为每个执行dot
。文件名位于$i
。
这使用backtick substitution并且是一种有用的机制,用于捕获命令输出以供后续在另一个命令中使用。
要删除扩展程序并添加其他扩展程序,请使用${i%.*}.svg
。有关详细信息,请参阅this SO answer。
答案 2 :(得分:2)
您无法在此处进行重定向。 find
使用execvp(3)
或朋友,而不是shell执行。相反,使用shell globs,或创建一个脚本然后可以从find
一个例子:
for i in ./*.dot
do
svg=${i%.dot}.svg
dot -Tsvg "$i" > "$svg"
done
答案 3 :(得分:1)
您遇到的问题是在find命令之前处理重定向。您可以通过在-exec调用中生成另一个bash进程来解决此问题。这也可以使用参数扩展轻松删除扩展名。
find . -name "*.dot" -exec bash -c 'dot -Tsvg "$1" > "${1%.*}".svg' -- {} \;