2017年5月24日水曜日

bash便利帳

自分に便利なワンライナーの雛形

ダミーテキストを作ったりする場合

同じ内容のテキストファイルを1000行作る。for文。
for i in {1..1000}  ; do echo こんにちは。>>こんにちは2.txt ;done

{}内がブレース展開される。結果1000回こんにちはする。
#zshでは、単一コマンドの場合、do/doneを省略できる。
for i in {1..1000}  ; echo こんにちは。>>こんにちは2.txt

#複数の動画ファイルの幅を調べる
mediainfo *.mp4 | grep Width |cat width.txt | perl -pe 's/^.*\: //,s/(\d) (\d\d\d)/$1$2/' | grep -oP '\d{3,4}' | sort | uniq
mediainfo では4桁の場合、空白が入る「1_920」ので、それ[ ]を削除しています。


#再生する動画ファイルの横幅を調べて、変数に格納する。シェルスクリプト内で使うと便利かも。
PIXELS=`mediainfo "$1" | grep Width |perl -pe 's/(\d) (\d\d\d)/$1$2/' | grep -oP '\d{3,4}'`
echo "Width $PIXELS pixels."

たとえば昔のビデオカメラ映像は小さいので、思い切り拡大して再生する。画質がよくなるわけではありませんけれど、幅に応じて拡大サイズを指定すると便利です。

case "$PIXELS" in

        320 )
        mpv --window-scale=6.0 "$1"
        ;;
        1920 )
        mpv "$1"
        ;;
        *)
        mpv --window-scale=1.0 "$1"
        ;;
esac

--window-scale=6.0 は、mpvのオプションです。キーボードでもできます。マウスでもできますが、ちょっと確認するだけなら操作は少ないほうがいいですよね。

大型4k所持者も少しづつ増えてきたので、 FHDは、
mpv --window-scale=1.5 "$1"


にしておいて、クリックで全画面に移行させるというのもいいかもしれません。
#


#
#
#

Sは、suffixのS ものぐさzsh: 実行コマンドを入力せずにファイル名単独でアプリと共に実行する。

Zshで可能で、Bashでできないシリーズ

#説明

% file.flac (enter)

とすると、mpvが起動すると楽といえば楽かもしれないという設定。
言い換えると、拡張子判別実行ですね。 どうなんでしょう?!
設定してから何年もたちますが当方の利用頻度は低いですね。bashが基本なので。

% *.mkv

以下の設定をするとmkv拡張子ファイルがmpvに割り当てているため自動実行されます。便利といえば便利か。

mpv --hwdec=auto --  *.mkv と等価。


以下bashのお話。

bashではこの芸当はできませんので、そこがあれ。bash ならふつうにグロブ展開させるのは同じですが、「mpv 」と入力する必要がありますよね。スペース含めると4文字打鍵。先頭に戻る必要がありますし、5文字打鍵か。

$ mpv *.mkv

mpvで起動する場合は、bash内蔵bindで モデファイラー-m に次のような割当を行っています。これはこれで便利。意味は、カーソル位置がどこにあろうが先頭に移動してmpv以下の文字列で実行する、です。マクロですね。

    bind '"\ea":beginning-of-line' #alt-a も行頭に戻る。この妥協が一番よさそう。

    bind '"\em":"\eampv --start=00:00:00 --profile=vdpau \C-m"' #alt-m
余談:たぶんこう書いても同じです。
    bind '"\em":"\eampv --start=00:00:00 --profile=vdpau \n"' #alt-m
    bind '"\em":"\eampv --start=00:00:00 --profile=vdpau \C-j"' #alt-m

かなり長い文字列がOKみたいです。 mpvは今profile選択をメインにしていますけれど、全部1キー操作に置き換えることもできそう。効率的かはどうかとして。

余談すぎる余談。

ファンクションキーに割りあてる場合。完全1キー。こういう雛形を作成したので、少しづつ何かを割り当てていっています。覚えきれないけれど。笑) .inputrc よりこのほうが自分には調整しやすいかもです。zshのbindkey を並列して眺めつつできるだけ共通化しようと考えているんです。

#f5 f6 f7 f8 雛形
    bind '"\e[15~":"F5"' #F5 にキー割り当て
    bind '"\e[17~":"F6"' #F6 にキー割り当て
    bind '"\e[18~":"F7"' #F7 にキー割り当て
    bind '"\e[19~":"F8"' #F8 にキー割り当て

#接尾辞エイリアス suffixの -s
#拡張子判別実行
#極端な話、全拡張子に xdg-open にしておくとGUIデフォルトなので楽かも。

以下のその1を .zshrc  末尾にでもぺったんして、試してみてください。その2は機械的にPerl で作成しただけなので、まったく触っていませんので、編集しながらお試しください。


#その1 触ってみて採用:雛形 
#極端な話、全拡張子に xdg-open にしておくとGUIデフォルトなので楽かも。

# 引数込で指定もできた。コマンドの妥当性ではなくてどういう書式なのか確かめたということです。

alias -s  mkv="mpv --hwdec=auto -- "
alias -s  mp4="mpv --profile=opengl-hq --hwdec=vdpau -- "
alias -s m2ts="mpv
--hwdec=vaapi -- "
alias -s   ts="mpv --fps=60 -- "
alias -s  wmv=mpv
alias -s  avi=xdg-open

alias -s flac=mpv
alias -s  wav=mpv
alias -s  mp3=mpv
alias -s  ogg=mpv
alias -s  tta=mpv
alias -s  ape=mpv
alias -s  tak=mpv

alias -s  txt=atom
alias -s conf=atom
alias -s  rc=code

#alias -s pl=code 

#実行権限付与したかもしれないテキストは分岐させるか、関連づけないほうがいいですよね。たぶん。
#alias -s plx=code
#alias -s sh=code
#alias -s bash=code

#その2 ががーと生成してみた。すべて未検証
# 拡張子自動判別実行 てきとー::右側にタブいれるとエラーになる。

alias -s  Z=xdg-open
alias -s  gz=xdg-open
alias -s  bz2="bzip2 -cd %C|"
alias -s  deb=xdg-open
alias -s  rpm="rpm2cpio %C|cpio -tv" -f "%a %x %u %g %s %m %d %y %f"
alias -s  7z=xdg-open
alias -s  rar=xdg-open
alias -s  jpg=xviewer
alias -s  JPG=xviewer
alias -s  jpeg=xviewer
alias -s  png=xviewer
alias -s  PNG=xviewer
alias -s  gif=xviewer
alias -s  GIF=xviewer
alias -s  bmp=xviewer
alias -s  BMP=xviewer
alias -s  mpg=mpv
alias -s  wmv=mpv
alias -s  WMV=mpv
alias -s  avi=mpv
alias -s  mp4=mpv
alias -s  m4v=mpv
alias -s  mkv=mpv
alias -s  mov=mpv
alias -s  mpeg=mpv
alias -s  ts=mpv
alias -s  3gp=mpv
alias -s  mp3=mpv
alias -s  m4a=mpv
alias -s  ogg=mpv
alias -s  wma=mpv
alias -s  iso=cvlc
alias -s  flac=mpv
alias -s  wav=mpv
alias -s  tak="paplay -v"
alias -s  tta="paplay -v"
alias -s  ape="paplay -v"
alias -s  cue=audacious
#

2017年5月23日火曜日

シェルスクリプト1行便利帳(うつけ者用)


1行「定型文」 =1行制御構造の活用


横着かつ勉強好きでもないので、1行で押し込めるマイ「定型文」をけっこう使います。エディターの行編集で便利だからですが。1行なので書き足すだけ。複数行は使いにくい。
スクリプトのエレガンス度合いの問題ではなくて、簡便にしたいだけですね。不要になれば行削除できるわけで。
プログラマーではない自分にはあっています。マニュアルを読まない独学素人なので、根本的に何かが違うのかもしれません。ただきちんと間に合っているので悪くはないと思います。


ホーム~でうっかり実行しないようにする「オレンジ行」。ホームには.bashrcが必ずあるので。

#!/bin/bash
#@ Rename(J).pm によるリネーム
#~なら何もしないで終了。
if ls -a | grep -E '.bashrc' ; then exit ; fi

renameall -v
zenity --info \
--text="Rename(J).pm によるリネームが終わりました。\n対象:\n$PWD"

exit

ZiSH

オレンジ行は、.bashrc があれば何もしないで終わる、です。pwdでみてもいいんですがこれのほうが自分にはあってる。もっとかんたんに書けるのなら乗り換えたいです。ファイル存在を確認するより、このgrep を使うパターンひとつのみ覚えると応用がかなりきいてすんごく捗るのでこうしています。(プロの方からはその不真面目な発想を笑われそうですが) もっとも、.ICEauthority の存在をみたほうがいいのかも――とこだわっても仕方がないですね、たぶん。

ついでに、何をしているかを説明すると、

0)ホームにいるなら(.bashrcがあれば)何もしないで終わる。
1)ファイルリネームルールを悉皆適用する(renameall自作コマンド)
2)処理が終わったよダイアログをzenityで出す。マウスクリックで終わり。数分かかる場合があるので実行したことを忘れていたりする(笑)。

このスクリプトをmate/cinnamon で右クリックメニュー実行にしています。ターミナルでは叩きません。 マウス操作では特にうっかり実行してしまうので。あはは。

オレンジ行は単純。grepの返り値でマッチしたらexit。すんごくかんたんな分岐ですが自分のスクリプト中では活用度が高いです。

右クリックメニュー作成について 「右クリックメニューの拡張 scripts nemo caja」

#
#
#
#
#
#
#

2017年5月22日月曜日

利用中シェルに応じてコマンドを使い分ける。bash or zsh

zshとbashを同時並べつつカスタマイズしている最中に便利なコマンドであり、その雛形です。

  • zsh/bashでプロンプトの形や色などで変えていても間違えることがある。
  • キーバインドの統一カスタマイズ作業をしている最中はとりわけ混乱する。
  • 実はかなり間違えている。年に10回以上は:笑)
ので

以下をぺったんして、(当方はシェル関数はbash/zsh 共通のrcファイルにしています。共通で動かない関数は原則使いません。メンテがめんどうだからです。意識は高くないです。~/.bash_functions.rc にzsh/bash共通利用関数を書いています)
以下の実使用中の雛形では、bashrc または zshrc と打てば、rcファイルへの変更が反映されます。shrc というコマンド名もないはずなので、そういうので統一してもいいでしょう。

余談ですが、このパターンを利用して ~.keybindings というキーバインディング設定rcを.zshrc/.bashrcから読み込ませています。
#
#@ シェル関数定義
#

    function bashrc () {
        #bashrc/zshrc で rc をシェルに応じて再読込。カレントシェル判別。
        CURRENT_SHELL=`set | grep -aoP '^(B|Z)A?SH_VERSION'`

        case $CURRENT_SHELL in
            BASH_VERSION )
              source ~/.bashrc && echo 更新完了 source ~/.bashrc ;;
            ZSH_VERSION  )
              source ~/.zshrc  && echo 更新完了 source ~/.zshrc  ;;
            *)
                echo not zsh , not bash  ;;
        esac
    }
    alias zshrc=bashrc
#zshrc としても、bashrcとしても、同じ。

# BASH_VERSION='4.3.46(1)-release'
# ZSH_VERSION=5.1.1
# csh / tcsh / fish (^fish_)などは使いませんのでこれで充足しています。

#~/.bashrc .zshrc


 if [ -f ~/.keybindings ];         then  .  ~/.keybindings    ; fi

#~/.keybindings

CURRENT_SHELL=`set | grep -aoP '^(B|Z)A?SH_VERSION'`
case $CURRENT_SHELL in

ZSH_VERSION  ) 
#ZSHはここから定義。
    bindkey "\e[3;2~" kill-word  #bash/zsh 共通
    bindkey '^x^e' edit-command-line #FC と等価 bash 標準アサインと統一した。
      ;;

BASH_VERSION )  #BASHはここから定義。

#■ ALT-シリーズ
    bind '"\ea":beginning-of-line' #alt-a も行頭に戻る。この妥協が一番よさそう

;;
esac
#.inputrc に設定するよりこっちのほうが自分は楽。


青色の行でシェル名が変数に格納できますので、bashならほげ、zshなら、ふげというシンプルなcase分岐ができています。(カレントシェルに応じて)同じようなことをしたいけれどコマンド名が微妙に違うってケースは、シェル内蔵コマンド bind(bash)/bindkey(zsh)などでもありますよね。

zsh/bashに特化していますので、
grep で、a=アスキー限定、o=一致部分切り出し、P= Perl互換正規表現
としています。これで、ZSH_VERSION という文字列がCURRENT_SHEL格納できるわけです。
~/binなどにはこの分岐を使った他のツールもおいています。

余談。grep の -Pオプションは、なんだかんだいっても便利です。Perl互換の正規表現だけ覚えていればいいのでGNUツールのみしか使わないって人にはうってつけかも。職業的なプログラマー、SEなどであれば様々なUnix環境に対応したいと思うのでしょうが、自分は関係ないので。そういえば、このオプションでなんとかなっているので、pcregrep/pcre2grep は使いませんね。以前はエクスペリメンタルだった気がしますが、今はカジュアルに使っていいのではないかと。


zshは素晴らしすぎ便利すぎです。だから人間があほになりそう!!とbashを使うんですが、zshもいいよな、と。10年位こんなことを繰り返しています。あはは。もっとインテリジェント、エレガントな解法があれば乗り換えますので、ご教授ください。

#~/.profile mint18.1の .profile(ログインシェルで読み込まれる?!)では次のように書かれていました。さっき気がつきました。


# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi


2017年5月13日土曜日

nemo, nautilus などでサムネイルが表示されない場合

とりあえず、以下を一旦削除して入れ直したら、きれいに治った。(という現象)です。 ubuntu 16.04/mint 18.1 Cinnamon

新規にターミナル(端末)を開きます。ubuntu系は以下を同時押し。CTRL+ALT+T
#
sudo apt install ffmpegthumbnailer

2017年4月23日日曜日

非常事態、パッケージ管理システムのDBが壊れた場合

ハッシュサム不適合な事態に陥った場合などです。

次のコマンドで復旧していましたし、できますが。

年に数回でるようならメモリー不良を疑ったほうがいいかと。
必ず memtest で検査しましょう。
Windowsのメモリーテストはなぜか甘い。
通過したからといってだいじょうぶではありません。

        sudo rm -r /var/lib/apt/lists
        sudo mkdir /var/lib/apt/lists /var/lib/apt/lists/partial
        sleep 2
        sudo apt update


2017年4月20日木曜日

AMD RADEONドライバのできに我慢しきれず。

16.04LTS でのAMD RADEONドライバのできに我慢しきれず。――( [AMD/ATI] Tobago PRO [Radeon R7 360 / R9 360 OEM] )です。――PPAの開発版/Dailyにしました。遅延、コマ落ち、ブロックノイズなどの再生不良に耐えきれなかったからです。


当方では著しい改善が見られています。だけれども非推奨ですね。朝と夕方でぜんぜん質が異なったりしますので、追いかけるのも大変なのです。日に2度は降ってくる気がします。


なぜ入れてみたのか?! ですが、17.04ではとても円滑な動画再生と気がついたからです。
これまでPPA、それもドライバ関係は更新しないように、かなり我慢したのですが、改善がなくそれが16.04LTSの方針だと思う?!と仕方ありません。

LTSの意味が自分の中で消失した瞬間でした。

とはいえ、カーネルでも大差がでたりします。4.8、4.10、4.11などもテストで使っていますが以下が最も安定して速い組み合わせみたいです。CinnamonよりもMATEのほうが不具合が少ないですね。このように独自に調べることが多くて大変。



たぶん次の手順でいれたかと思います。


新規にターミナル(端末)を開きます。ubuntu系は以下を同時押し。CTRL+ALT+T
#
sudo add-apt-repository ppa:oibaf/graphics-drivers
#
sudo apt update
sudo apt upgrade
#当方で安定しているカーネルとDesktop Environment
System:    Host: phantom Kernel: 4.4.0-78-generic x86_64 (64 bit)
Desktop: Cinnamon 3.4.1
Distro: Linux Mint 18.2 Sonya


日に数度updateが降ってきます。安定している方はいれないほうがよいと思います。
FHDレベルで使っていたら気がつかなかったと思いますが、4Kにしちゃうと遅延だのが目立つわけで、「RADEON最低だな(半分いいがかり、半分は正しい)」。

自分としてはとてもハッピーです。この水準でLTSなのか?? パーソナル利用については、LTSにこだわる必要がそんなにないのかなとも考えてしまいました。

※追記 2017年5月15日


5/11のupdate以降、動画再生が非常に円滑になりました。4KでのVDPAU遅延コマ落ちが激減しました。グラフィックボードの買い替えも視野においていたのですがそのまま行こうかと思います。

その時のupgradeリストそのままメモしています。
● 2017-05-11_18:24:42 ●-------一覧表示...
  • libegl1-mesa/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libegl1-mesa-drivers/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libgbm1/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libgl1-mesa-dri/xenial 17.2~git1705110730.6d7660~gd~x i386
  • libgl1-mesa-glx/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libglapi-mesa/xenial 17.2~git1705110730.6d7660~gd~x i386
  • libgles1-mesa/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libgles2-mesa/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libosmesa6/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libvlc5/xenial-updates 2.2.2-5ubuntu0.16.04.2 amd64
  • libvlccore8/xenial-updates 2.2.2-5ubuntu0.16.04.2 amd64
  • libwayland-egl1-mesa/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • libxatracker2/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • logrotate/xenial-updates 3.8.7-2ubuntu2.16.04.1 amd64
  • mesa-va-drivers/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • mesa-vdpau-drivers/xenial 17.2~git1705110730.6d7660~gd~x amd64
  • openssh-client/xenial-updates 1:7.2p2-4ubuntu2.2 amd64
  • ssh-askpass-gnome/xenial-updates 1:7.2p2-4ubuntu2.2 amd64
  • virtualbox-guest-dkms/xenial-updates,xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.1 all
  • virtualbox-guest-utils/xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.1 amd64
  • virtualbox-guest-x11/xenial-updates 5.0.40-dfsg-0ubuntu1.16.04.1 amd64
  • vlc/xenial-updates 2.2.2-5ubuntu0.16.04.2 amd64
  • vlc-data/xenial-updates,xenial-updates 2.2.2-5ubuntu0.16.04.2 all
  • vlc-nox/xenial-updates 2.2.2-5ubuntu0.16.04.2 amd64
  • vlc-plugin-notify/xenial-updates 2.2.2-5ubuntu0.16.04.2 amd64
  • zlib1g/xenial-updates 1:1.2.8.dfsg-2ubuntu4.1 amd64
  • zlib1g-dev/xenial-updates 1:1.2.8.dfsg-2ubuntu4.1 amd64