試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GUIファイルマネージャから選択した複数のファイルを結合する

Thunar(Xfce4)やNautilus(GNOMENautilus-actions使用)で複数のファイルをGUIで結合するためのスクリプトと、そのアクション設定をここで扱う。
(2008/9/2)逆に、分割を行うスクリプトとアクション設定は「GUIファイルマネージャから選択したファイルを分割する」で扱っている。

スクリプト

Zenityを使用している。
[任意]ファイル名: action-cat.sh

#! /bin/bash

# 名前: 結合(_C)...
# 説明: 選択したファイルを結合します
# 依存: Zenity
# icon: 任意
# 対象: ファイルのみ/単複 ファイル名: *
# 種類:
#       Nautilus-actions: */*
#       Thunar: フォルダ以外全て
# 引数: 全てのファイル/ディレクトリのパス
#       Nautilus-actions: %M
#       Thunar: %F
# 概要: 複数ファイルを結合し、ダイアログで指定したファイルとして出力

# ファイルでないものがないかチェック
for F in "${@}"; do
  if [[ ! -f "${F}" ]]; then
    zenity --error --title "ファイルではありません" --text "\"${F}\"はファイルではありません"
    exit 1
  fi
done

# 出力ファイルの場所を指定
OUTFILE=$(zenity --file-selection --title "出力ファイル" --filename "$(dirname "${1}")/" --confirm-overwrite)
[[ ${?} -ne 0 ]] && exit 1  # キャンセルされたら何もしないで終了

# 進行状況を表示しながらファイルを結合
# 途中でキャンセルされたらファイルを消す
rm "${OUTFILE}" -f
for ((I = 1; I < ${#} + 1; I++)); do          # ${#}はファイル数
  echo $(((${I} - 1) * 100 / ${#}))           # パーセンテージをzenityに送る
  eval "cat \"\${${I}}\" >> \"${OUTFILE}\""   # 各ファイルを出力ファイルに追記)
done | zenity --progress --title "結合中" --text "結合中..." --auto-close || rm "${OUTFILE}" -f

(2008/9/2)ファイル名に半角スペースを含んだときの問題に対処
下は動作中の進行状況表示。

Thunarで使用する場合の設定

「基本」タブ
  • 名前: 結合(_C)...
  • 説明: 選択したファイルを結合します
  • コマンド: [スクリプトの場所・ホームディレクトリを「~」と書いてもOK] %F

(2008/9/2)引数部分(%F)が抜けていたのを修正

「登場する条件」タブ
  • 以下を選択した場合に登場: フォルダ以外全て

Nautilus-actionsで使用する場合の設定

既定の設定の部分は省略し、変更するところだけを書いている。

「メニュー・アイテムとアクション」タブ
「条件」タブ
  • 選択したアイテムが次に属していたら表示する
    • 選択したアイテムが複数のファイルまたはフォルダの場合は表示する

順番についての注意点

ファイルマネージャからスクリプトへ渡される引数の順番が結合の順番となり、ファイルマネージャ上の表示順になる。
表示されている順番が結合する順番と違った場合(降順整列している場合など)、結合後のファイルの内容が意図しないものとなる場合がある。
このスクリプトを使用する場合、結合したいファイルが必ず昇順*1に並んでいるということを確認する。

ファイル名に半角スペースが含まれる場合

結合したいファイルの名前に半角スペースが含まれていると、うまく引数としてファイル名が渡らずに結合ができない場合がある。
Thunarの場合、複数ファイルを選択して「名前変更...」を選択すると一括で名前を変更できるので、半角スペースを一時的に別の文字に変更するとこの問題を回避することはできる。

(2008/9/2)この問題はスクリプトの修正*2により対処済み。

関連記事:

使用したバージョン:

  • Thunar 0.9.0(0.9.0-r2)
  • Nautilus 2.22.5.1 / Nautilus-actions 1.4.1
  • Zenity 2.22.1

*1:「file.000,file.001, file.002」のように、小さい値から増えていく形

*2:「for F in "${@}"; do」のようにダブルクォートして書くことで、渡された引数にスペースが入っていても正常に展開されるようになった。この他には、スペースを含む可能性のある文字列変数をダブルクォートしている