L'Isola di Niente
L'Isola di Niente » Nautilus Tips » Nautilus をスクリプトで拡張

Nautilus をスクリプトで拡張

Nautilus はスクリプトを利用して簡単に拡張できます。
検索すると bash スクリプトしか見当たりませんが Python, Gjs 等も使えます。
2018.07.10 : 色々と現状に合わせて追加と削除
2017.10.22 : 内容が古くなった(Linux の進化早過ぎる)ので書き換え
2016.08.29 : 内容が古くなったので多数の書き換え
2014.01.03 : Python スクリプトの Python3 化及び整理
2013.01.28 : Nautilus 3.6 仕様の追記
2012.03.04 : PyGtk コードを PyGObject に書き換え、及び細かい整理
2010.08.14 : 一部修正及び追記

利用方法

ファイルマネージャが Nautilus なら以下のディレクトリが最初からあるはずです。
# Nautilus 3.6 以降
~/.local/share/nautilus/scripts

# Nautilus 3.4 以前
~/.gnome2/nautilus-scripts
ココに実行可能パーミッションを与えたスクリプトファイルを置くだけです。
又このディレクトリにサブディレクトリを作ればメニューに展開されます。

実行パーミッションを与えるにはスクリプトに chmod +x コマンド。
GUI で個別にやりたいならコンテキストメニューからプロパティを選んで
[プログラムとして実行できる] にチェックを入れます。

環境変数として以下が用意されております。
NAUTILUS_SCRIPT_SELECTED_FILE_PATHS        # 選択中ファイルのフルパス(改行区切り)
NAUTILUS_SCRIPT_SELECTED_URIS              # 上記を URI に変換したもの
NAUTILUS_SCRIPT_CURRENT_URI                # 現在表示しているディレクトリの URI
NAUTILUS_SCRIPT_WINDOW_GEOMETRY            # [横幅]x[高さ]+[左からの座標]+[上からの座標]


# bash からは書くまでもなく $ を付けて利用
$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS

# Python は os モジュールで
import os
s = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"]

// Gjs は GLib で
const GLib = imports.gi.GLib;
let s = GLib.getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS");
スクリプト実行時のカレントディレクトリは実行した時に開いているディレクトリになります。

実行可能パーミッションを与えた時点でコンテキストメニューに即時で追加されます。
右クリック、MacBook に入れているなら二本指タップで出るメニューです。
何も選択していないとこのメニューは出ません

一つ登録した後なら下画像のように「このフォルダーを開く」メニューも利用できるようになります。

img/nautilus_328.png

ファイルを送る形なので普通にファイル名が起動パラメータとして取得もできます。
bash の場合 $@ で取得できます。

3.18 からはファイル名のアンダーバーをニーモニックとして使えるようになりました。
(Alt キーとアンダーバーの次のアルファベットキーで実行できる機能)
3.24 からは名前順に並ぶようになった。

スクリプトの例

以下は筆者が利用している例。
拡張子は不要、シバンは必ず書いてください(UNIX のお約束)
お好みの言語を利用して作ってください。

現在開いているディレクトリから端末を開始
#!/bin/sh

gnome-terminal

*.html や実行パーミッションを付けた *.py を一発で gedit で開く
以下ならファイル名に半角空白があっても開くことが可能
#!/bin/sh

#gedit $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS これでもいいけど
gedit "$@"

つまり Windows の「送る」みたいなランチャになる
よく使うものはどんどん登録してしまおう
#!/bin/sh

ghex "$@"

zip 展開で cp932(引きこもりが Shift-JIS だと信じて疑わない、又は脳が可哀想な上司が「一番普及している文字コードだと信じて疑わない、2018 年の現状ではエロゲ専用 OS だけで使われている文字コード)
なファイル名の時
Fedora の unzip もパッチが当たっているので実は以下で文字化けさせず展開できる
#!/bin/sh

for filename in "$@"; do
    unzip -Ocp932 "$filename"
done

3.22 で改悪されたファイル圧縮機能がショボすぎる...
tar.gz が選べないって UNIX としてどうなのよ?
unrar を入れると cbz を一発で作れる、という機能が使えないってどうなのよ?
以下で以前と同じダイアログが出せる、file-roller に送っていただけだったのね
#!/bin/sh

file-roller --add "$@"

実行パーミッションを一発で切り替える
#!/bin/sh

for name in "$@"
do
    [ -x $name ] && chmod -x $name || chmod +x $name
done 

デジカメや iPhone から画像を転送すると拡張子が大文字(*.JPEG)になっている
それらをまとめて小文字(*.jpg)に変更
#!/bin/sh

for name in "$@"
do
    mv $name ${name%.*}.jpg
done

ディレクトリ内の無作為なファイル名画像が膨大な数に!
ということがよくあるのは筆者だけ?
とりあえずゼロ詰めな連番にしてしまおう、という場合用
#!/bin/sh

# 選択ファイルのみリネームするが既存ファイルは残すように

num=1
for name in "$@"; do
    while : ; do
        newname=`printf %03d.jpg $num`
        if ! [ -e $newname ] ; then
            mv $name $newname
            break
        fi
        ((num++))
    done
done

大きな画像へのリンク用の小さな画像作り(jpeg, png 限定)
生成する画像の名前は Wordpress が付ける名前っぽいサイズを付加する例
#!/usr/bin/env python3

from gi.repository import GdkPixbuf
import os

path_array = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"].split("\n")
for filepath in path_array:
    try:
        pixbuf = GdkPixbuf.Pixbuf.new_from_file(filepath)
    except:
        continue
    # 300*300 以下で最大の大きさにする
    d_width = 300
    d_height = 300
    # GdkPixbuf のサイズ取得
    p_width = pixbuf.get_width()
    p_height = pixbuf.get_height()
    # 小さい方に合わせる計算
    width = 0
    height = 0
    if (d_width * p_height) > (d_height * p_width):
        width = p_width * d_height // p_height
        height = d_height
    else:
        width = d_width
        height = p_height * d_width // p_width
    # リサイズされた Pixbuf 作成
    smallpix = GdkPixbuf.Pixbuf.scale_simple(pixbuf, width, height, GdkPixbuf.InterpType.BILINEAR)
    # jpeg or png
    name, ext = os.path.splitext(filepath)
    ext = ext.lower()
    if ext == ".jpg" or ext == ".jpeg":
        smallpath = "{0}-{1}x{2}.jpg".format(name, width, height)
        smallpix.savev(smallpath, "jpeg", ["quality"], ["85"])
    elif ext == ".png":
        smallpath = "{0}-{1}x{2}.png".format(name, width, height)
        smallpix.savev(smallpath, "png", ["compression"], ["9"])

ffmpeg を使って H.264 + aac (or mp3) の FLV や MOV 動画を MP4 コンテナに変更
Finder や Explorer でもサムネイル可能になるメリットがある
#!/bin/sh

for name in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
    ffmpeg -i $name -vcodec copy -acodec copy ${name%.*}.mp4
done

ffmpeg を使って動画ファイルを結合
ファイル名で勝手にソートされるのでその順番で結合されます
#!/bin/sh

txt=connect_list.txt
name=${1%.*}
ext=${1##*.}

for s in $@; do
    echo file $s
done > $txt

ffmpeg -f concat -i $txt -c copy out_$name.$ext
rm $txt

動画の回転 (90°)
#!/bin/sh

for fname in $@; do
    ffmpeg -i $fname -vf transpose=1 -metadata:s:v:0 rotate=0 r90_$fname
done

動画の回転 (180°)
#!/bin/sh

for fname in $@; do
    ffmpeg -i $fname -vf hflip,vflip -metadata:s:v:0 rotate=0 r180_$fname
done

動画の回転 (270°)
#!/bin/sh

for fname in $@; do
    ffmpeg -i $fname -vf transpose=2 -metadata:s:v:0 rotate=0 r270_$fname
done


[管理者権限でファイルを開く] は Fedora27 からできなくなったので削除しました
Google Chrome キャッシュ取得も仕様変更が激しいので削除しました
スマホ動画の切り出しは Wayland 対応の VidCutter を使うようになりました

Copyright(C) sasakima-nao All rights reserved 2002 --- 2018.