#命令行参数 #stdin #输入输出 #文件输入 #命令行工具 #文件I/O #实用工具

bin+lib o-o

允许假设标准输入和输出的命令读取和写入命令行中指定的文件

15 个版本

0.5.2 2024年5月12日
0.5.1 2024年5月12日
0.4.5 2023年1月25日
0.4.3 2022年10月4日
0.2.3 2021年11月25日

#380命令行工具

MIT/Apache

33KB
703

o-o

允许假设标准输入和输出的命令读取和写入命令行中指定的文件。

是什么?为什么?

你是否遇到过命令调用命令和重定向之间的干扰问题?

例如,以下命令行

ls *.txt | xargs -I {} head -n 3 {} > {}-head.out

不会为每个 *.txt 文件创建 *.out 文件,而是创建一个包含所有 head 命令执行输出的文件 {}-head.out

命令 o-o 就是来帮助的!

现在你可以这样运行

ls *.txt | xargs -I {} o-o - {}-head.out - head -3 {}

用法

o-o 参数是子进程的标准输入、标准输出和标准错误输出,后续参数是要启动子进程的命令行。

如果您指定 - 作为标准输入等文件的名称,则不会进行重定向。在文件名前加上 + 将以追加模式打开文件。

Run a sub-process and customize how it handles standard I/O.

Usage:
  o-o [options] <stdin> <stdout> <stderr> [--] <commandline>...
  o-o --help
  o-o --version

Options:
  <stdin>       File served as the standard input. Use `-` for no redirection.
  <stdout>      File served as the standard output. Use `-` for no redirection, `=` for the same file as the standard input, and `.` for /dev/null.
  <stderr>      File served as the standard error. Use `-` for no redirection, `=` for the same file as the standard output, and `.` for /dev/null.
                Prefix with `+` to append to the file (akin to the `>>` redirection in shell).
  -e VAR=VALUE                      Set environment variables.
  --pipe=STR, -p STR                String for pipe to connect subprocesses (`|` in shell) [default: `I`].
  --separator=STR, -s STR           String for separator of command lines (`;` in shell) [default: `J`].
  --tempdir-placeholder=STR, -t STR     Placeholder string for temporary directory [default: `T`].
  --force-overwrite, -F             Overwrite the file even if subprocess fails (exit status != 0). Valid only when <stdout> is `=`.
  --keep-going, -k                  Only effective when multiple command lines are chained with the separator. Even if one command line fails, subsequent command lines continue to be executed.
  --working-directory=DIR, -d DIR   Working directory.
  --version, -V                     Version information.
  --help, -h                        Shows this help message.

安装

使用 cargo 命令进行安装。

cargo install o-o

示例

1. 提取每个 PDF 文件的第 5 行

当您知道 PDF 的特定行将包含您所需的信息时,例如文章的标题。

ls *.pdf | rargs o-o - - - pdftotext '{0}' - I head -5 I tail -1

在这里,

  • rargs 是一个工具,它接受文件名并执行指定的命令行,类似于 xargs
  • pdftotext 是一个从 PDF 文件中提取文本的工具。

2. 从 Excel 文件中提取 vba 源代码

对于每个 *.xlsm 文件,从中提取 vba 源代码,删除前 5 行,并将代码保存到具有相同名称但扩展名改为 .vba 的文件中。

ls *.xlsm | rargs -p '(.*)\.xlsm' o-o - '{1}'.vba - olevba -c '{0}' I sed -e 1,5d

例如,当存在一个名为 foo.xlsm 的文件时,上述代码执行以下命令行。

olevba -c foo.xlsm | sed -e 1,5d > foo.vba

在这里,

  • olevba 是一个从 Excel 文件中提取 VBA 代码的命令。

3. 从视频文件转录音频

从视频文件 amovie.webm 中提取音频,保存到一个临时音频文件,然后从临时音频文件中提取文本。临时文件在临时目录中创建,并在处理完成后被删除。

o-o - - - ffmpeg -i amovie.webm T/tmp.wav J whisper T/tmp.wav --model=medium

上述命令行与以下命令行类似,只是创建了一个临时目录。

ffmpeg -i amovie.webm tmp.wav ; whisper tmp.wav --model=medium

在这里,

  • ffmpeg 是一个用于处理音频文件和视频文件的工具。
  • whisper 是一个从音频文件转录文本的工具。

许可证

MIT/Apache-2.0

依赖项

~2–11MB
~134K SLoC