https://github.com/tos-kamiya/o-o
Enables commands that assume the standard input and output to read and write to files specified in the command line.
https://github.com/tos-kamiya/o-o
cli-utility
Last synced: 10 months ago
JSON representation
Enables commands that assume the standard input and output to read and write to files specified in the command line.
- Host: GitHub
- URL: https://github.com/tos-kamiya/o-o
- Owner: tos-kamiya
- Created: 2021-10-30T18:09:51.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2024-05-24T15:31:59.000Z (almost 2 years ago)
- Last Synced: 2025-04-13T00:35:55.746Z (11 months ago)
- Topics: cli-utility
- Language: Rust
- Homepage:
- Size: 90.8 KB
- Stars: 5
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README-ja_JP.md
Awesome Lists containing this project
README
o-o
===
標準入出力を想定しているコマンドをコマンドラインに指定されたファイルへと読み書きできるようにする。
## 何でこんなものを?
コマンドを起動するコマンドとリダイレクトが微妙に干渉してこまったことはありませんか?
例えば、次のコマンドラインは、
```sh
ls *.txt | xargs -I {} head -n 3 {} > {}-head.out
```
実行すると、`*.txt`ファイルのそれぞれに`*-head.out`ファイルを生成しません。
すべての`head`コマンドの実行の結果を含む一つの`{}-head.out`を生成します。
このような場合に`o-o`を使ってください。
次のように実行できます。
```sh
ls *.txt | xargs -I {} o-o - {}-head.out - head -3 {}
```
## 使い方
`o-o`の引数は、子プロセスの標準入力、標準出力、標準エラー出力で、それ以降の引数は子プロセスを起動するためのコマンドラインです。
標準入力等のファイル名として`-`を指定したものはリダイレクトしません。ファイル名の前に`+`を付けると追加モードでファイルを開きます。
```
サブプロセスを実行し、標準I/Oの設定を変更します。
利用法:
o-o [options] [--] ...
o-o --help
o-o --version
オプション:
標準入力として扱われるファイルです。 `-` でリダイレクトしません。
標準出力として使われるファイルです。 `-` でリダイレクトしません。標準入力と同じファイルにする場合は `=` とします。`.`を指定すると/dev/nullになります。
標準エラー出力として扱われるファイルです。 `-` でリダイレクトしません。標準出力と同じファイルにする場合は `=` とします。`.`を指定すると/dev/nullになります。
ファイル名の前に `+` を付けると追加モードになります(シェルの`>>`リダイレクトです)。
-e VAR=VALUE 環境変数。
--pipe=STR, -p STR サブプロセスをつなげるパイプを表す文字列(シェルでは`|`)。デフォルトは`I`です。
--separator=STR, -s STR コマンドラインの区切りを表す文字列(シェルでは`;`)。デフォルトは`J`です。
--tempdir-placeholder=STR, -t STR 一時ディレクトリに展開される文字列。デフォルトは`T`です。
--force-overwrite, -F 終了ステータスが != 0 のときもファイルを上書きします。 が `=` のときのみ有効です。
--keep-going, -k コマンドラインがセパレータで繋がれているときのみ効果があります。あるコマンドラインが失敗しても、続くコマンドラインを実行します。
--working-directory=DIR, -d DIR 作業ディレクトリ。
```
## インストール
Cargoコマンドによりインストールしてください。
```sh
cargo install o-o
```
## サンプル
### 1. 各PDFファイルの5行目を抽出する
PDFの特定の行が必要な情報(例えば、記事のタイトル)を含んでいるとわかっている場合に。
```
ls *.pdf | rargs o-o - - - pdftotext '{0}' - I head -5 I tail -1
```
このコマンドラインで、
* [rargs](https://github.com/lotabout/rargs) は指定されたファイル名を与えてコマンドラインを実行するツールです(xargsに類似したツールです)。
* [pdftotext](https://github.com/jalan/pdftotext) PDFファイルからテキストを抽出するツールです。
### 2. エクセルファイルから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](https://pypi.org/project/oletools/) はExcelのファイルからVBAのコードを抽出するツールです。
### 3. 動画ファイルの音声を文字起こしする
動画ファイル`amovie.webm`から音声を抽出して一時ファイルに保存し、次に、その音声ファイルから文字起こしを行います。
一時ファイルは一時ディレクトリ上に作成され、処理が終わった時点で削除されます。
```sh
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](https://ffmpeg.org/) は音声ファイルや動画ファイルを加工するツールです。
* [whisper](https://github.com/openai/whisper) 音声ファイルからの文字起こしツールです。
## ライセンス
MIT/Apache-2.0