- 1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その9 pc11.2ch.net/test/read.cgi/unix/1187130302/
- 701 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 21:47:22 ]
- >>700
ありがとうございました 修正できました
- 702 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 22:34:02 ]
- シェルスクリプトでPerlとかRubyのchopと同等なことって、
どうすればいいですか? bash限定でもかまいません。
- 703 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/20(日) 22:42:41 ]
- >>702
シェルでは、何も考えなくても readとかで読み込んだら自動的に chopされてる。
- 704 名前:名無しさん@お腹いっぱい。 [2008/04/20(日) 23:31:00 ]
- >>703 さっきは、
「echo -nで改行が取れないなあ、あれ?」って状態で質問したのですが、 readでも取れませんでした。で、ようやく\r\n改行だったことに気づきました。 bashの%*\r*で解決しました。
- 705 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 00:26:14 ]
- 質問させてください
テキストファイル内に 建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい) ()でくくられた文字のみを取り出したいのですが可能でしょうか?
- 706 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 00:36:23 ]
- >705
いくらでも方法はある。 sed、awk、perl あたりなら一行野郎でいける。 awk -F '\\(|\\)' 'length($2)>0{print $2}'
- 707 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 00:44:02 ]
- >>706
レスありがとうございます! ちなみにsedだと、どういう風になりますか?
- 708 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 02:15:09 ]
- >>706
建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい) こういうテキストのこともないかな。
- 709 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 02:19:44 ]
- $ echo '建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい)' | sed 's/[^(]*(\([^)]*\))/\1/g'
けんぞうぶつこうちくぶつこうぞうたい
- 710 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 18:20:49 ]
- 多分、作りこまないと駄目だと思うんですが、駄目元で質問します。
`find .`の結果を各ディレクトリ毎に、 第1のソートキー:ディレクトリorファイルの別(ディレクトリが先) 第2のソートキー:更新時間の降順 でソートしたものが欲しいです。 ファイルブラウザとかだと、そういう表示が出来るので、 もしかすると、簡単におこなう方法があるのかな?と密かに期待してます。 宜しくお願いします。
- 711 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 18:56:59 ]
- 普通に考えたら出来る
- 712 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 19:01:20 ]
- >>711
結果をファイルに出力してもいいのであれば、 find -type dでループを回していけばやれるのはわかっているのですが、 作業ファイルを介さずにそのままwhile readで受け取れるくらい 簡単な方法がないかな?と思って質問させて頂きました。
- 713 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:12:16 ]
- 多分スクリプト言語使った方がいいと思う
- 714 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 19:19:38 ]
- >>713
ちょっとごめんなさい ディレクトリは名前順でもいいです。 当初>>710で書いたよりはずっと簡単に実現できます。
- 715 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:19:44 ]
- >>711
そういうことはお前の考えた結果を貼ってから家。
- 716 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:26:48 ]
- >>714
「ディレクトリが先」という条件さえなければ、 単に ls -latR で行ける。findすらいらない。 >>712 結果をファイルに出力する方法でやる方法がわかってるなら、 それをファイルに出力しない方式に書き換えることは多分できる。
- 717 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 19:31:02 ]
- >>710
GNU ls使えば、 ls -latR --group-directories-first で一発。
- 718 名前:名無しさん@お腹いっぱい。 [2008/04/21(月) 20:23:19 ]
- みなさんどうもありがとうございました。
結局(とりあえず)、 find -d でループを回して作業ファイルを作る方法にしました。 ディレクトリは名前順でファイルは更新時間降順にしました。 ちなみにGNU ls 5.21で--group-directories-firstはサポートされてませんでした。
- 719 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:04:47 ]
- find ... -print0|xargs -0 ...
と区切りをわざわざ^@にするのが推奨されてるのって何故なんですか?
- 720 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:13:18 ]
- 他の文字はファイル名に使われてるかもしれないから。
- 721 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:55:46 ]
- -print0|xargs-0を使うのは石器人。
現代人なら-exec utility_name [argument ...] {} +
- 722 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 21:57:15 ]
- いまさら-execはちょっと…という気分
気分だけね
- 723 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 22:08:08 ]
- >>722
お前、行末の「+」の意味知ってて発言してるのか?
- 724 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 22:15:16 ]
- >>718
GNUコマンド群くらい最新にしとけよ。6.xなら使える。
- 725 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 02:59:08 ]
- >>724
バージョンアップできない(許可されない)環境って結構多いぞ。 (*nix系ならローカルに実行環境つくれば済む話だが)
- 726 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 07:04:01 ]
- >>725
もしそういう環境なら、GNU lsを入れること自体許可されないだろ。 (古いバージョンとは言え)GNU lsが入っているということは、 OS標準じゃないコマンドを自分でインストールしてもいい環境と考えられる。
- 727 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 10:39:16 ]
- システム構築時にGNU系を入れて構築、運用開始した後、
バージョンアップの費用(現システムの稼働確認費用)が認められないため、そのままってパターンが多い。 そういうトコだと、ローカルに新版lsをコピーしてくる方が(手続き的に)楽だったり。
- 728 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 12:30:34 ]
- >>710
タイムスタンプが、 2008-04-22 12:30 こういう形式で、 $6, $7にあると仮定すれば、 ls -l | sort -k 6,7 | sort -sr でいい。-sはstable sort。
- 729 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 13:27:05 ]
- >>728
それだと symbolic link が先頭に来てしまうので失格。
- 730 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 13:30:00 ]
- >>728
というか、せっかく sort -k 6,7 したあとで sort -sr したら 最初の sort -k 6,7 が無意味になってしまうし、全然ダメじゃん。
- 731 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 19:43:49 ]
- つ sort -srk 1,1
- 732 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 19:58:42 ]
- >>731
>>729 失格。
- 733 名前:名無しさん@お腹いっぱい。 [2008/04/23(水) 15:40:13 ]
- Apache の mod_ext_filter モジュールを利用したスクリプトを作成しています。
Apache --標準出力--> script --標準出力 --> Apache を行うスクリプトにて、 Apache からの標準出力を $temp_file に書き出して主な処理をした後に cat $temp_file を行い Apache に返しているのですが、 #!/bin/sh temp_file=`mktemp` while read line do echo "$line" >> $temp_file done ファイル操作 cat $temp_file rm -f $temp_file 上記コードだと、HTML ソースに \ $ ` などが入っていた際に、 echo "$line" >> $temp_file で意図せぬ動作が起きてしまいます。 またファイルに書き出す事で処理速度の低下も考えられるので、 Apache からの標準出力(複数行)を変数に格納する方法はないかと思ったのですが、 どなたかご教授ください。
- 734 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/23(水) 20:08:40 ]
- >>733
それはシェルのreadの仕様だから仕方ない。 そもそも while readで読む必要ないだろ。 while do ... done の部分全部を、 cat > $temp_file に置き換えればよろし。
- 735 名前:733 mailto:sage [2008/04/23(水) 20:31:31 ]
- >>374
おぉ、色々と勘違いしていたみたいですね。 ご指摘の方法でやってみたところちゃんとできました。 すみません、ほんと有難うございます。
- 736 名前:733 mailto:sage [2008/04/24(木) 00:18:33 ]
- 733です。
度々すみません。 #!/bin/sh temp_file=`mktemp` cat > $temp_file ファイル操作 cat $temp_file rm -f $temp_file 確かにご教授いただいた上記コードで可能なのですが、 Apache からの標準出力をファイルに書き出さず、変数として処理する事は出来ないのでしょうか?
- 737 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 00:55:16 ]
- そんなに速度が気になるなら他の言語でやったほうがいい
- 738 名前:733 mailto:sage [2008/04/24(木) 01:45:55 ]
- >>737
ありがとうございます。 色々試行錯誤してみます。
- 739 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 06:52:22 ]
- >>736
その「ファイル操作」の内容が、 sed 's/hoge/boke/' < $temp_file だとすると、そもそもcatは2つとも要らない。 #!/bin/sh sed 's/hoge/boke/' ↑の2行だけでOK。 sedは、何も指定しないと標準入力から読んで標準出力に出すから。
- 740 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 06:56:05 ]
- >>736
一旦変数に入れたいなら、 tmp=`cat` とする。これで変数tmpに入る。 参照する時は、 echo "$tmp" とする。シェルに特殊文字を解釈されないように" "を付けるのを忘れないように。
- 741 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 19:36:45 ]
- >>739
返信ありがとうございます。 標準入力の内容によって条件わけがしたかったので、ご指摘の方法は断念しました。 >>740 返信ありがとうございます。おかげさまで出来ました。 一つ疑問が残るのですが、ダブルクォート (") は $ ` \ 以外を普通の文字として扱うと認識していますが。 # echo "`date`" Thu Apr 24 17:55:30 JST 2008 # cat sample.html <html> <body> `date` </body> </html> # cat filter.sh #!/bin/sh temp=`cat` echo "$temp" # cat sample.html | sh filter.sh <html> <body> `date` </body> </html> なぜ echo "$temp" では ` が普通の文字として扱われているのでしょうか? お恥ずかしい質問で済みません。
- 742 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 19:38:59 ]
- 変数、サブシェルなどの展開は一度だけ。
再度展開したい時はeval。
- 743 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 20:15:21 ]
- >>742
eval をさっそく調べ、勉強になりました。 ありがとうございます。
- 744 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:26:56 ]
- 質問させてください。
シェルスクリプトで16進数を2進数に変換するにはどうしたらいいでしょうか?
- 745 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:49:57 ]
- どうしてもシェルスクリプトというならこんな感じか。
最適なのはbc。sedだけでもできる。 h2b() { for h in `echo $1 | sed 's/\(.\)/ \1/g'`; do case $h in 0) echo -n 0000;; 1) echo -n 0001;; 2) echo -n 0010;; 3) echo -n 0011;; 4) echo -n 0100;; 5) echo -n 0101;; 6) echo -n 0110;; 7) echo -n 0111;; 8) echo -n 1000;; 9) echo -n 1001;; a|A) echo -n 1010;; b|B) echo -n 1011;; c|C) echo -n 1100;; d|D) echo -n 1101;; e|E) echo -n 1110;; f|F) echo -n 1111;; esac done echo }
- 746 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:54:10 ]
- >>755
あ、どうしてもってわけじゃないです。 コマンドとかありますか?何度もすいません。
- 747 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:17:50 ]
- bcで16進数を2進数に変換。
できそうでよくわからない・・・orz
- 748 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:18:21 ]
- bcならこんな感じかな、便利だね知らなかったよ。
echo "obase=2; ibase=16; $1" | bc
- 749 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:32:27 ]
- >>748
ありがとう。しかしながら 例えば 0xffffff00 これを10進数に変換したいと思い echo "obase=10; ibase=16; 0xffffff00" | bc とやってみましたがsyntax errorがでました・・・orz
- 750 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:40:21 ]
- 頭に0xは付けずに,それから大文字で書かないといけないっぽい.
- 751 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 02:03:41 ]
- >>750
なるほど。ありがとうございました。
- 752 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 06:48:02 ]
- >>749
bcなんか使わなくても printfで一発だろww $ printf '%d\n' 0xffffff00 4294967040
- 753 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 08:48:45 ]
- んっと、釣られとくけど、
志村ー
- 754 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:18:18 ]
- >>753
なにが釣りなのかわからないゆとりな俺にkwskたのむ シェルスクリプトのtmtowtdiな感じって好きだ
- 755 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:28:34 ]
- printf(3)は二進がないからなあ。
printf(1)の%bは違う意味だし。
- 756 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:35:12 ]
- >>775
欲嫁。 >>749 は 16進→10進の質問。 >>752 はそれに最適解を答えている。
- 757 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:01:10 ]
- 昨日質問した者です。ちょっと間違ってました。ごめんなさい。
正しくは ffffff00 これを 255.255.255.0 に変換したい。です。 これってできるのでしょうか?
- 758 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:09:13 ]
- 簡単だね
>>757 $ hex=ffffff00 $ printf '%d.%d.%d.%d\n' `echo $hex | sed 's/../0x& /g'` 255.255.255.0
- 759 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:57:09 ]
- >>758
すごいなぁ。ありがとう。
- 760 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 12:50:24 ]
- >>758 これは(・∀・)イイ!! もれももらた
- 761 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 16:59:52 ]
- よく読まずに余計な突っ込みした >>753 は今ごろ赤面ww
- 762 名前:名無しさん@お腹いっぱい。 [2008/04/28(月) 17:23:56 ]
- >>761
kannke-nexekedo お前のレスうざい
- 763 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 09:04:12 ]
- シェルで、拡張子の付いていないファイルを一発でワイルドカード指定するには
どうすればいいですか? あるいは、何かのオプション変更とかで、 * で、hogeとかだけにマッチして、 hoge.hog にはマッチしないようにして、 *.* とやった時だけ hoge.hogにマッチするようにしたいんです。
- 764 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 09:43:06 ]
- 一部シェル限定ならできる
一発でなくていいならできるようにはできる
- 765 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 11:18:22 ]
- >>764
kwsk
- 766 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:33:12 ]
- >>764 は、具体的な「やりかた」を書かない(書けない)知ったかの
>>680 と同一人物、に1俵。
- 767 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:39:25 ]
- >>765
シェルは何だ? ワイルドカード使うシチュエーションは?カレントディレクトリだけなのか? ファイルの表示ができればいいだけなのか?各ファイルに何かするのか? >>766 あいにく違うな 1俵よこせ
- 768 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:43:35 ]
- >>767
じゃなくて、逆にその「できるシェル」を教えて欲しい。 シチュエーション関係なしに、すべての場合において * が hoge.hogにはマッチしないようにしたい。
- 769 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:46:16 ]
- EXTENDED_GLOBつきのzshで*~*.*かな。
- 770 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:55:22 ]
- * 1個の動作を変えられるようなシェルはないかと思う
同じくzshで setopt EXTENDED_GLOB ls -d [^.]#
- 771 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:57:46 ]
- command.com
- 772 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:01:56 ]
- 少なくとも >>766 だけうざいな
- 773 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:50:40 ]
- シェルを秘密にしたいのだからエスパースレに行くべきだな。
全ての場合を見通して答えてくれるエスパー様(>>766)に任せよう。
- 774 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:58:03 ]
- できるシェルを教えてくれっていう質問だから、
シェルを秘密にしてるのとは違うかと
- 775 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 20:45:09 ]
- よく読まずに余計な突っ込みした >>773 は今ごろ赤面ww
- 776 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:08:40 ]
- >>775
お前のレスうざい
- 777 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:32:45 ]
- OSを秘密にしているのだから、エスパー様の出番だな。
余計な突っ込みした、知恵足らずの>>775は今ごろ赤面ww
- 778 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:41:31 ]
- シェルはOSには依存しないな。
余計な突っ込みした、知恵足らずの>>777 は今ごろ赤面ww
- 779 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 21:43:02 ]
- > シェルはOSには依存しないな。
> シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。
- 780 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:54:17 ]
- まあよくある願望とごっちゃにしたな
- 781 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:04:17 ]
- たとえば最近の例を引き合いに出すが、
>>757 の質問(OS不明)に >>758 が的確に回答してる。 どこにもOSに依存してるところはないな。 >>757 に対して「OSが秘密じゃ答えられない」なんていってる奴は 無知をさらけ出してる奴。OSがわかったところで答えられないだろう。
- 782 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:06:52 ]
- 全然関係ない事例を持ち出して
> シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 を誤魔化そうとする>>778憐れ。
- 783 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:08:34 ]
- 本件事例の
>>769 の回答は、OSには依存しないな。
- 784 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:17:34 ]
- 糞みたいな雑談でスレを延ばすなよ
コードで語れ
- 785 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:22:29 ]
- G Em7 Am7 Am7/D D7 G
- 786 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:23:36 ]
- >>769は誤回答。お題は「* で、hogeとかだけにマッチして、hoge.hog にはマッチしない」
- 787 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:25:33 ]
- OSに依存しない誤回答ですね。
- 788 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:45:17 ]
- 誤解答を例示して
> シェルはOSには依存しないな。 を誤魔化そうと必死の>>778憐れ。
- 789 名前:名無しさん@お腹いっぱい。 [2008/05/02(金) 11:38:05 ]
- $ls
test1.jpg test10.jpg test2.jpg test3.jpg test4.jpg test5.jpg test6.jpg test7.jpg test8.jpg test9.jpg と1桁の数字からなる連番ファイルがあるときに $ls test0001.jpg test0002.jpg test0003.jpg test0004.jpg test0005.jpg test0006.jpg test0007.jpg test0008.jpg test0009.jpg test0010.jpg というように4桁の連番ファイルにリネームしたいのですが、 ご教授お願いします。
- 790 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:40:37 ]
- >>789
mv sed printf for これだけ調べればできる
- 791 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:41:07 ]
- 書き忘れた、
test10.jpg これ 1桁の数字じゃないよな
- 792 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:43:03 ]
- >>789
環境依存かつ汎用性ナシだけど、 おれならこうやっちゃう。 $ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done $ mv test10.jpg test0010.jpg
- 793 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:49:01 ]
- >>789
#!/bin/sh for file in *.jpg do num=`expr $file : '[^0-9]*\([0-9]*\)'` base=`expr $file : '\([^0-9]*\)'` num=`printf %04d $num` echo mv $file $base$num.jpg done
- 794 名前:789 mailto:sage [2008/05/02(金) 11:52:46 ]
- >>791
最初1桁の例だけ書いてたんで、 2桁も混じっているということを書き忘れました。 >>792 $ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done $ for i in {10..99}; do mv test$i.jpg test00$i.jpg; done ってかんじですかね。ありがとうございます。
- 795 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:52:51 ]
- >>790
具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。
- 796 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:53:29 ]
- >>794
>>793
- 797 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:55:18 ]
- 3桁のときは、0を一つ、2桁の時は、0を2つ
一桁のときは、0を3つってつけてけばいいねん sedだけでできる
- 798 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:56:45 ]
- >>797
そんなことをしなくても >>793 で一発。
- 799 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:57:56 ]
- でしたね^^
解決したようで
- 800 名前:793 mailto:sage [2008/05/02(金) 12:09:21 ]
- sedだけでやるならこうかな
↓ #!/bin/sh for file in *.jpg do new=`echo $file | sed 's/[0-9]/0000&/; s/[0-9]*\([0-9][0-9][0-9][0-9]\)/\1/'` mv $file $new done
- 801 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:11:08 ]
- ごちゃごちゃしてるなぁ
|

|