交错两个通配符命令

时间:2014-11-23 00:51:56

标签: bash unix

我是unix shell的新手,可以真正使用你的帮助!

我有一个脚本可以生成很多我的C ++项目的.tex文件,如下所示:

  

a.h.tex a.cpp.tex b.h.tex b.cpp.tex ... etc。

然后我在所有这些上运行pdflatex并使用以下结果将结果文件合并为:

pdftk *.pdf cat output merged_code.pdf

这很好但是通配符按字母顺序匹配文件,所以当我想在它们之后使用它们时,我最终会在头文件之前使用cpp文件。我想把我的主文件放在最后(或开始),所以:

  

a.h.pdf然后a.cpp.pdf然后b.h.pdf然后b.cpp.pdf ... main.cpp.pdf

而不是

  

a.cpp.pdf然后a.h.pdf然后b.cpp.pdf然后b.h.pdf ... main.cpp.pdf ...

我做了很多研究,试图像这样插入ls的输出:

shopt -s extglob
paste -d '\n', <(ls *.h.pdf) <(!(main).cpp.pdf

作为输入,但虽然它看起来很有前途,但它最终没有用,所以我非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

shopt -s extglob
echo $(paste <(ls *.h.pdf) <(ls !(main).cpp.pdf main*))

我会说你自己找到了答案。我几乎只是在您的示例中使用了代码并添加了main* 给你的信用。


实施例

$ ls
a.cpp.pdf  a.h.pdf  b.cpp.pdf  b.h.pdf  main.cpp.pdf

$ echo $(paste <(ls *.h.pdf) <(ls !(main).cpp.pdf main*))
a.h.pdf a.cpp.pdf b.h.pdf b.cpp.pdf main.cpp.pdf

答案 1 :(得分:2)

您的粘贴尝试非常接近。我认为问题只是粘贴需要线条而你没有将输入分成线条。

试试这个:

$ ls
a.cpp.pdf  b.h.pdf    d.cpp.pdf     r.cpp.pdf  s.h.pdf
a.h.pdf    c.cpp.pdf  d.h.pdf       r.h.pdf    t.cpp.pdf
b.cpp.pdf  c.h.pdf    main.cpp.pdf  s.cpp.pdf  t.h.pdf
$ echo $(paste <(echo *.h.pdf | tr ' ' '\n') <(echo !(main*).cpp.pdf | tr ' ' '\n')) main.pdf
a.h.pdf a.cpp.pdf b.h.pdf b.cpp.pdf c.h.pdf c.cpp.pdf d.h.pdf d.cpp.pdf r.h.pdf r.cpp.pdf s.h.pdf s.cpp.pdf t.h.pdf t.cpp.pdf main.pdf