ラベル sh の投稿を表示しています。 すべての投稿を表示
ラベル sh の投稿を表示しています。 すべての投稿を表示

2011年4月5日火曜日

Cygwin で rename コマンド

(2012.01.19)更新

rename
#!/bin/sh

if [ $# -lt 2 ]; then
  echo "USAGE: $0 /変更対象/変更後/ ファイル名展開のパターン文字列"
  exit 0
fi
RE="$1"
shift 1

# ファイル名が - で始まるとき ./ を先頭に挿入
# ファイル名内の ' を '\\\\'' でクォート
#   →sed('\\'') →mv('\'')
# ファイル名をホールドスペースへ保存
# ファイル名を ' でクォート
# パターンスペースとホールドスペースを交換
# ファイル名を正規表現で変換
# 変換したファイル名を ' でクォート
# 変換したファイル名をホールドスペースへ追記
# パターンスペースとホールドスペースを交換
# 改行をタブに変更してから
# xargs で mv へ送る
while [ $# -gt 0 ]; do
 echo "$1";
 shift 1
done | sed -e "
s/^-/.\/-/
s/'/'\\\\''/g
h
s/^/'/
s/$/'/
x
s$RE
s/^/'/
s/$/'/
H
x
s/\n/\t/
" | xargs -L 1 mv -v

(2011.04.05)

rename コマンドを実行したら "bash: rename: command not found"。cygwin.com のパッケージ検索ページでも見つからない。

Cygwin にはどうやら rename コマンドがないらしいので、下記ページを参考に sed ベースで書き換えてみる。

  • 【Linux Tips】 テキストファイルの一括置き換え/ファイル名の一括置き換え: 日々此精進
    → http://murakan.cocolog-nifty.com/blog/2009/11/linux-tips-5aa7.html
/bin/bash
$ /bin/ls -d ファイル名展開のパターン文字列 | sed -e '
s/ /\\ /g
h
s/変更対象/変更後/
x
G
s/\n/\t/
' | xargs -L 1 mv

ファイル名が .txt で終わるファイルの前に今日の日付を追加するなら、

/bin/bash
/bin/ls -d  *\.txt | sed -e "
s/ /\\ /g
h
s/^/$(date +"%y%m%d")-/
x
G
s/\n/\t/
" | xargs -L 1 mv

2010年3月8日月曜日

gnome デスクトップ - ダブルクリックで実行したときの変数

/tmp/test/$PWD.sh
#!/bin/sh echo $PWD read -n 1 -p "any key for exit" i
結果
/tmp/test any key for exit
/tmp/test/$0.sh
#!/bin/sh echo "$0" read -n 1 -p "any key for exit" i
結果
/tmp/test/$0.sh any key for exit

シェルスクリプト/バッチファイルで一時停止

シェルスクリプト

bash
$ echo -n "any key for exit"; stty -echo; read -n 1 i; stty echo; echo
any key for exit
$ 

下記 shell で確認

  • bash(sh で起動)
    GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
  • ksh
    sh (AT&T Research) 93s+ 2008-01-31

バッチファイル

Command Prompt
>pause
続行するには何かキーを押してください . . .

>

下記 shell で確認

  • cmd.exe
    Microsoft Windows XP [Version 5.1.2600]

2010年3月7日日曜日

シェルスクリプト/バッチファイルでフルパス名を分割

シェルスクリプト

フルパス名からファイル名部分を取り出す

bash
$ echo $PWD
/usr/local/lib/firefox-3.6
$ echo ${PWD##*/}
firefox-3.6
$ 

※ 先頭の最長一致部分を削除

フルパス名からディレクトリ名を取り出す

bash
$ echo ${PWD%/*}
/usr/local/lib
$ 

※ 末尾の最短一致部分を削除

下記 shell で確認

  • bash(sh で起動)
    GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
  • ksh
    sh (AT&T Research) 93s+ 2008-01-31

バッチファイル(cmd.exe)

フルパス名からファイル名部分を取り出す

Command Prompt
>echo %CD%
C:\WINDOWS\system32\drivers\etc
>for %i in ("%CD%") do @echo %~ni%~xi
etc

>

※ ~n:ファイル名(拡張子を除く)
※ ~x:拡張子

フルパス名からディレクトリ名を取り出す

Command Prompt
>for %i in ("%CD%") do @echo %~di%~pi
C:\WINDOWS\system32\drivers\

>

※ ~d:ドライブ名を展開
※ ~p:パス名を展開

下記 shell で確認

  • cmd.exe
    Microsoft Windows XP [Version 5.1.2600]