xargs の使い方メモ

たまにしか使わないで済んでいるのでいつも使い方を忘れる。

基本

コマンドの出力をパイプで渡すと、各行をコマンドの最後の引数として実行する。

ls | xargs md5 -q

これは次のように展開されたものと同じ。

md5 -q foo
md5 -q bar
md5 -q baz
...

ただしファイル名にスペースを含んでいると上記の方法ではうまくいかない。この場合、次の節で説明するプレースホルダを使用する。

プレースホルダ

xargs では -I オプションで引数を展開する場所を指定することができる。-I '{}' のように指定すると、{} の場所に引数が展開される。

ls | xargs -I '{}' md5 -q '{}'

これでスペースを含むファイル名もうまく展開される。

md5 -q 'foo'
md5 -q 'bar'
md5 -q 'foo bar'
...

処理系によっては小文字の -i オプションで -I '{}' と同等の動作になるので alias を指定しておくと便利かもしれない。

alias xargs-i='xargs -I "{}"'

拡張子の変更

xargs を使って拡張子を一括置換するにはプレースホルダに加え、 sed を組み合わせるとよい。

find . -name '*.txt' | sed -e 's/[.]txt$//' | xargs -I '{}' mv '{}.txt' '{}.md'

応用例として、 FFmpeg で動画から音声トラックのみ抽出するコマンドを挙げる。

find . -name '*.mp4' | sed -e 's/[.]mp4$//' | xargs -I '{}' ffmpeg -i '{}.mp4' -c:a copy '{}.m4a'

Windowsスクリーンショットを一括で JPEG に変換してリネーム

PowerShell は使わず、WSL の bashzsh などから使用する。ImageMagick (convert コマンド) がインストールされているものとする。

ls スクリ*.png | \
    sed -e 's/スクリーンショット (//' -e 's/)[.]png//' | \
    xargs -I '{}' convert 'スクリーンショット ({}).png' 'image-{}.jpg'

一部を切り抜きたい場合はその座標を指定して

# -crop (width)x(height)+(left)+(top)
ls スクリ*.png | \
    sed -e 's/スクリーンショット (//' -e 's/)[.]png//' | \
    xargs -I '{}' convert 'スクリーンショット ({}).png' -crop 1140x641+601+199 'image-{}.jpg'

FFmpeg でオーディオファイルの音量を調整する

Windows 10 に付属する標準の音楽プレイヤーは曲ごとに再生時の音量を設定することができないようなので、 FFmpeg を使って MP3 や AAC の音量を調整した。

ここで使用した FFmpeg のバージョンは N-93565-g0ad0533e91 (2019/2)。

ffmpeg -i INPUT -c:v copy -filter:a "volume=-6dB" OUTPUT

オプションの詳細は次の通り。

  • -i INPUT …… 入力ファイル
  • -c:v copy …… 映像パートはコピーする
  • -filter:a "volume=-6dB" …… 音声にフィルタを適用する
    • 音量は -6dB のようにも調整できるし、 0.5 など [0, 1] の値を設定することもできる。デシベル値を設定する場合は B が大文字でないといけないことに注意
  • OUTPUT …… 出力ファイル

macOS Mojave をクリーンインストールした

Catalina から Mojave にダウングレードするため macOS Mojave をクリーンインストールした。

この Mac にプリインストールされていた OS は Mojave だったので、Mac の起動直後に shift + option + command + R キーを押し、プリインストールされていたバージョンに最も近い OS をインストールした。OS のインストール自体は 1 時間足らずで完了。

データの復元は Time Machine バックアップで難なくできた。400 GB ほどのデータで 5 時間ほどかかった。

Homebrew を macOS Mojave にインストール

Homebrew のサイトに記述されている次のコマンドを実行すると、インストールされるファイルやディレクトリの一覧が表示される。

% ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following new directories will be created:
/usr/local/bin
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/sbin
/usr/local/share
/usr/local/var
/usr/local/opt
/usr/local/share/zsh
/usr/local/share/zsh/site-functions
/usr/local/var/homebrew
/usr/local/var/homebrew/linked
/usr/local/Cellar
/usr/local/Caskroom
/usr/local/Homebrew
/usr/local/Frameworks
==> The Xcode Command Line Tools will be installed.
Homebrew でインストールしたパッケージ
brew install rbenv ruby-build readline
brew install ffmpeg
brew install imagemagick
brew install dnsmasq
brew install unar

Node.js のインストール

Node.js は最新の推奨バージョン 12.14.1 をインストーラからインストールした。

MuseScore プラグイン API

サンプル

Score

プロパティ/メソッド 説明
newCursor() : Cursor
nstaves : Number 譜表の数

Cursor

プロパティ/メソッド 説明
staffIdx : Number 譜表のインデックスを参照または設定する
voice : Number 声部のインデックスを参照または設定する [0, 4)
segment : ?
element : Element カーソル位置の要素を取得する
rewind (position : Number) : void カーソル位置を指定の場所に巻き戻す
next () : void カーソルを次の位置に進める

Element

プロパティ/メソッド 説明
type : ElementType 要素の型を取得する
notes : Note[] コードに含まれる音符のリスト。低い順
ElementType
説明
Element.CHORD コード(音符)
Element.REST 休符

Note

プロパティ/メソッド 説明
type : Number
name : String
parent : Object
selected : Boolean
visible : Boolean
small : Boolean
offsetX : Number
offsetY : Number
z : Number
lineType : ?
line : Number
direction : ?
velocity : Number ベロシティを参照もしくは設定
veloOffset : Number 相対ベロシティを参照もしくは設定

ブラウザ版 YouTube プレイヤーの表示を改善する

操作ボタン

.ypt-chrome-bottom プログレスバー、再生、ボリューム、設定等のボタンがある部分。次のようにして動画の外に持っていける。

#info {
	margin-top: 40px !important;
}
.html5-video-player {
	overflow: visible;
	z-index: 100;
}
.ytp-chrome-bottom {
	z-index: 999;
	bottom: auto;
	top: 100%;
	opacity: 1 !important;
	background: #444;
}
.ytp-gradient-bottom {
	display: none;
}

動画上に出てくる広告

画面下に持っていく。

.ytp-ad-overlay-slot {
	position: fixed !important;
	bottom: 0 !important;
	top: auto;
}