シェルスクリプト総合 その2
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2005/04/17(日) 00:17:17まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。
□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/
□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/
□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0708名無しさん@お腹いっぱい。
2005/07/22(金) 21:44:560709名無しさん@お腹いっぱい。
2005/07/22(金) 22:21:07"/usr/local/Program Files" の下にシェルスクリプトがあったり
するんじゃないの?
0710名無しさん@お腹いっぱい。
2005/07/22(金) 22:41:000711名無しさん@お腹いっぱい。
2005/07/22(金) 22:42:03http://www.wwwwwwwwww.net/1/soko/VIP00991.JPG
0712名無しさん@お腹いっぱい。
2005/07/22(金) 22:44:460713名無しさん@お腹いっぱい。
2005/07/22(金) 22:50:120714名無しさん@お腹いっぱい。
2005/07/22(金) 22:53:05a2pのバグと思われ。(s2pもそうかな)
所詮perlのおまけソフトなので、
それがperlクオリティー。
0715名無しさん@お腹いっぱい。
2005/07/23(土) 02:08:250716名無しさん@お腹いっぱい。
2005/07/23(土) 07:42:240717sasasa
2005/07/23(土) 12:17:120718名無しさん@お腹いっぱい。
2005/07/23(土) 12:18:390719名無しさん@お腹いっぱい。
2005/07/23(土) 12:30:13その、新しいスクリプトのlsが存在するディレクトリに
先にPATHを通す。
PATH=/home/hoge/bin:$PATH; export PATH
とか。
(csh系は糞なので敢えて説明はしないがrehash等が必要)
>>718 はアフォなので無視。
# commandコマンドの動作を勘違いしてるようだし、
# command自体、Bourneシェルでは使えない
あ、「正しいls」というのが、「元の標準のls」という意味なら、
/bin/ls と、フルパスで実行する。
0720名無しさん@お腹いっぱい。
2005/07/23(土) 12:36:58(゚Д゚)ハァ?
0721名無しさん@お腹いっぱい。
2005/07/23(土) 12:38:58(゚Д゚)ハァ?
0722名無しさん@お腹いっぱい。
2005/07/23(土) 12:59:06lsがシェル関数だとcommand lsで回避できますが、
スクリプトだとだめでした。
>>719
ありがとうございます。
やっぱり絶対PATHしかないんですね。
0723sasasa
2005/07/23(土) 13:16:11"
'
`
の意味って何を意味しているんですか?
0724名無しさん@お腹いっぱい。
2005/07/23(土) 13:20:29'"` はクォートという。
質問が基本的過ぎるので、
man shして、クォートの欄を読むか、
シェルスクリプトの参考書のクォートの欄を読め。
ここでの質問はもっと具体的なものでよろしこ。
0725名無しさん@お腹いっぱい。
2005/07/23(土) 13:30:51たとえば、
rm -rf /
は危険なコマンドとして有名だが、
' 'を使って、 'rm -rf /' とすると、
スペースを含めて「rm -rf /」という名前のコマンドとみなされるので、
実行しても、
# 'rm -rf /'
rm -rf /: No such file or directory
と、エラーになるので全く安全。
では練習問題。' 'を ` ` に変えて
# `rm -rf /`
をやってみよう。
0726名無しさん@お腹いっぱい。
2005/07/23(土) 13:37:28これはひどい練習問題だ。
0727名無しさん@お腹いっぱい。
2005/07/23(土) 13:39:380728名無しさん@お腹いっぱい。
2005/07/23(土) 14:03:50全く安全というか、意味ねーし
0729名無しさん@お腹いっぱい。
2005/07/23(土) 14:04:34(゜Д゜)ハァ?
0730名無しさん@お腹いっぱい。
2005/07/23(土) 14:37:16お前、意地悪だな
0731名無しさん@お腹いっぱい。
2005/07/23(土) 14:47:26課題の内容をここで聞いてるのか・・・・。
ちなみにきっと俺とお前は同じ大学だろう。
0732名無しさん@お腹いっぱい。
2005/07/23(土) 14:54:24http://pc8.2ch.net/test/read.cgi/unix/1119703835/573
0733名無しさん@お腹いっぱい。
2005/07/23(土) 15:43:56ぷげら
0734名無しさん@お腹いっぱい。
2005/07/25(月) 00:07:31特定のディレクトリを次々にバックアップするために、
コピー元 => コピー先
のペアをリスト化してループ処理させたいのですが、
どのように記述すればよいのでしょうか。
0735名無しさん@お腹いっぱい。
2005/07/25(月) 00:09:40find でがんばる、とか?
0736名無しさん@お腹いっぱい。
2005/07/25(月) 00:16:59なんだいな?backuplistファイルの内容が
source1 dest1
source2 dest2
...
とかなってたら、
cat backuplist | while read source dest
do
cp $source $dest
done
とかでいいじゃん。cpの代わりにtarなりcpioなり、cp -aなり、好きにして。
0737名無しさん@お腹いっぱい。
2005/07/25(月) 00:17:07えーと、
list={
. { /hoge/hoge1 => /fugo/fugoA }
. { /hoge/hoge2 => /fugo/fugoB }
. { /hoge/hoge3 => /fugo/fugoC }
}
foreach ( pair in list )
. コピー等の処理 pair[0] , pair[1]
みたいなことをしたいんです。
0738名無しさん@お腹いっぱい。
2005/07/25(月) 00:18:04まさにそれです^^
ありがとうございました。
0739名無しさん@お腹いっぱい。
2005/07/25(月) 00:50:550740名無しさん@お腹いっぱい。
2005/07/25(月) 01:00:25man paste
0741名無しさん@お腹いっぱい。
2005/07/25(月) 10:19:39そんな餌に釣られるクマー!
linuxが起動しなくなったんですけど(><)
0742名無しさん@お腹いっぱい。
2005/07/25(月) 21:08:56エラーが出るよ。
0743名無しさん@お腹いっぱい。
2005/07/26(火) 01:00:43mvコマンドで、一度に移動できるファイル数には上限があるのでしょうか?
最大で99999個のファイルを移動できるのか調査しているのですが・・・・
catコマンドが一度に1000件づつしか処理できないようなのですが。
ご存知の方がおりましたらどうぞよろしくお願いします。
0744名無しさん@お腹いっぱい。
2005/07/26(火) 01:22:270745名無しさん@お腹いっぱい。
2005/07/26(火) 01:41:35そんな調査するより xargs を使うべきじゃないの。
0746743
2005/07/26(火) 02:21:40>>743 xargsですか。ちょっと知らないコマンドですが、調べてみますね。レス感謝です。
0747名無しさん@お腹いっぱい。
2005/07/26(火) 02:21:47find /usr/include -name '*.h'|xargs grep ARG_MAX
0748名無しさん@お腹いっぱい。
2005/07/26(火) 02:40:210749名無しさん@お腹いっぱい。
2005/07/26(火) 02:46:40こういったことの周りの知識を知らないのも問題だが、
知識不足なのにいたずらに限界に挑戦しようとする方も問題。
知識不足なら知識不足なりに秘孔をついてしまわぬよう安全策をとるのが一つの見識。
0750名無しさん@お腹いっぱい。
2005/07/26(火) 07:55:30確かに xargs -n で引数を分割して実行できるが、
xargsはスペースや改行等を含んだファイル名を
正しく扱えないという、仕様上のバグがあるので、
xargs自体obsolete or deprecated。
xargs -0 (xargs --null)が使えるのはGNU xargsだけなので、
一般には使えないと考えるべき。
0751名無しさん@お腹いっぱい。
2005/07/26(火) 09:42:40でなきゃ GNU の入れりゃいいじゃん。
0752名無しさん@お腹いっぱい。
2005/07/26(火) 09:44:18だけではない。
0753名無しさん@お腹いっぱい。
2005/07/26(火) 09:47:48何が?
0754名無しさん@お腹いっぱい。
2005/07/26(火) 09:59:110755名無しさん@お腹いっぱい。
2005/07/26(火) 11:01:49「ファイル名に問題ないことが確実」な状況って、
自分の作業用ディレクトリ下で、
書き捨てスクリプトを書く場合くらいしかないぞ。
ユーザー開放のディレクトリ以下を一括処理したい場合、
どういうファイルネームが存在するかの仮定をしちゃいけないし、
GNU物を勝手に入れるのも禁止だから、
結局xargsなんて使えん、のが結論。
0756名無しさん@お腹いっぱい。
2005/07/26(火) 11:03:45勝手に入れちゃだめならしかるべき手続きを踏めばいいじゃない。
0757名無しさん@お腹いっぱい。
2005/07/26(火) 11:11:250758名無しさん@お腹いっぱい。
2005/07/26(火) 12:30:03特にSambaサーバにしてるならそういうファイル名は全然珍しくないわな
0759名無しさん@お腹いっぱい。
2005/07/26(火) 16:14:400760名無しさん@お腹いっぱい。
2005/07/26(火) 16:24:470761名無しさん@お腹いっぱい。
2005/07/26(火) 17:55:03Solaris 9 だと空白は大丈夫だし、改行も \ でエスケープすれば問題なしですが。
$ /bin/echo 'a b\nc\\\nd' | xargs -L 1 -I '{}' /bin/echo "'{}'"
{a b}
{c
d}
0762名無しさん@お腹いっぱい。
2005/07/26(火) 17:56:12いまどきSolaris使っている馬鹿ってpupupu−−−
0763名無しさん@お腹いっぱい。
2005/07/26(火) 18:23:08「Soralis」と書けばよかったのに
0764名無しさん@お腹いっぱい。
2005/07/28(木) 08:09:48xargsの-L 1オプション使ったら、
1行ごとにコマンド(echo)が実行されてしまうから、
元質問の、「まとめて処理」ができないだろ。
それに、「改行を \ でエスケープ」と言っても、
そう都合良く findで出力できないだろ。
さらに、ファイル名に普通の文字として、
" や ' や \ などが含まれていると
やっぱり駄目だろ。
よって、xargsは使えん。
0765名無しさん@お腹いっぱい。
2005/07/28(木) 08:23:23基本的にそれは考慮せんでもいいと思うんだが
0766名無しさん@お腹いっぱい。
2005/07/28(木) 09:24:00だとしたら xargs -0 も完全な解決策にはならないが。
0767名無しさん@お腹いっぱい。
2005/07/28(木) 10:05:15ファイル名にnull文字は使えねーよ。
だからxargs -0が最もマトモな解決法なのだが、
Solarisとかで使えないから問題になってるんだよ。
0768名無しさん@お腹いっぱい。
2005/07/28(木) 10:10:17改行は滅多にないとしても、
ファイル名に ' " \ などが含まれているのは
よくある。
「Don't Cry.mp3」とかね。
xargsが ' " \ を特殊文字扱いするのが問題になる。
0769名無しさん@お腹いっぱい。
2005/07/28(木) 11:46:07xargsが単純に改行をセパレータとして扱うような
プログラムだったなら、はるかにマシだっただろうね
0770名無しさん@お腹いっぱい。
2005/07/28(木) 14:45:330771名無しさん@お腹いっぱい。
2005/07/28(木) 14:50:42あっ、そんな記憶ある。
NEWS-OS 4 (3かな?) じゃないかな。
0772名無しさん@お腹いっぱい。
2005/07/28(木) 18:31:44/usr/5binにすらない。
(/usr/5bin/cpioとかならある・・ちなみにunameもない・・)
まあ、xargsは元SysV系ということで、
「使わなくても済むはずのコマンド」の扱いだったのだろう。
0773761
2005/07/28(木) 19:56:55761 で -L 1 を付けたのは、この例だと 1 行ずつ処理しないと
表示が分かりづらいからです。説明が悪かったですね。
改行の入ったファイル名は (find 的に) 無理ですが、
何とかすれば何とかなります。
$ touch "sp ace"
$ touch "single'quote"
$ touch 'double"quote'
$ touch 'back\slash'
$ find . -type f | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/\(.*\)/"\1"/' | xargs /bin/sh -c 'echo "[$1][$2][$3][$4]"' --
[./sp ace][./single'quote][./double"quote][./back\slash]
ま、そこまでして使いたいかと言えば No ですが。
0774名無しさん@お腹いっぱい。
2005/07/28(木) 20:27:47たしかにマシンのほとんどはNEWSだった。記憶があやふやだったので
local をつけたけど、やはり/usr/X11/binだったのかな
0775771
2005/07/29(金) 00:50:15記憶違いだったようで、スミマセン。
ひょっとしたら、初心者の私が
「ファイル名が x で始まるのに、どうして/usr/bin/X11にないんだ」
(笑わないでオクレ!)
と思ったのが記憶に残っていたのかもしない。
あっ、 NEWS-OSの X 関係は /usr/bin|lib/X11というのも違うかも。
近くの席にはSUN 3 が有ったなぁ。
0776名無しさん@お腹いっぱい。
2005/07/29(金) 03:39:56xargs はあった方が良いと思うんだが。
これの代わりをするには、たくさんコマンド組み合わせてやらないといかん希ガス
0777名無しさん@お腹いっぱい。
2005/07/29(金) 08:14:57あったという記憶は同じようだけど。NEWSのキーボードのタッチは好きだった。
「~」の位置のせいで痛いミスをしたことがあったが…
xargsはコマンドライン以外で使ったことがないかもしれん。
0778名無しさん@お腹いっぱい。
2005/07/29(金) 08:19:04xargsは実行時効率とタイプ量減らすためって気がする
たんに機能の話だけで言えば
cmdA | xargs cmdB
は
cmdA | while read i; do cmdB $i; done
でいいし(後者は効率が悪いがIFSで適切なデリミタを設定することもできる)
0779名無しさん@お腹いっぱい。
2005/07/29(金) 08:28:340780名無しさん@お腹いっぱい。
2005/07/29(金) 10:04:04随分昔の話なので、私の記憶が間違っていたのかと思いました。
>777
コマンドライン以外で使うxargs って、スクリプトの中に書くという事ですよね。
それとも、使いやすいGUIが有るとか? (そんなGUI 想像つかない)
# スレ違いなんで、このくらいにしておきます。 orz
0781名無しさん@お腹いっぱい。
2005/07/29(金) 18:23:59xarg はいらないの?
0782名無しさん@お腹いっぱい。
2005/07/29(金) 18:26:250783名無しさん@お腹いっぱい。
2005/07/29(金) 18:37:570784名無しさん@お腹いっぱい。
2005/07/30(土) 09:24:10xargs -i cmd {} でほぼ解決できる。
パフォーマンスは知らん。
0785名無しさん@お腹いっぱい。
2005/07/30(土) 10:19:58だからぁー、-iオプション付けると
-l 1も暗黙に付いちゃうから、xargs使う意味がなくなるんだよ。
解決するのはスペースを区切り文字とみなさないことだけであって、
\ とか ' とか " の問題はそのまま未解決。
0786名無しさん@お腹いっぱい。
2005/07/30(土) 10:28:10>-l 1も暗黙に付いちゃうから、xargs使う意味がなくなるんだよ。
意味不明。
0787名無しさん@お腹いっぱい。
2005/07/30(土) 11:01:57何を言ってるんだ?w
0788名無しさん@お腹いっぱい。
2005/07/30(土) 14:54:36f1 f2 f3 f4 ->f1.jpg f2.jpg f3.jpg f4.jpg
0789名無しさん@お腹いっぱい。
2005/07/30(土) 15:00:30mv $file $file.jpg
done
0790名無しさん@お腹いっぱい。
2005/07/31(日) 21:14:35rename って言ってるってことはMS-DOSプロンプトなんだろうよ
正解は >>791 よろしく
0791名無しさん@お腹いっぱい。
2005/07/31(日) 21:20:030792名無しさん@お腹いっぱい。
2005/07/31(日) 21:22:190793名無しさん@お腹いっぱい。
2005/07/31(日) 21:37:19ただし一般的ではない。
>>789
はダブルクォート付けていないから、減点だな。
0794名無しさん@お腹いっぱい。
2005/07/31(日) 21:45:25* はまずいだろ
0795名無しさん@お腹いっぱい。
2005/07/31(日) 22:00:170796名無しさん@お腹いっぱい。
2005/08/01(月) 08:28:050797名無しさん@お腹いっぱい。
2005/08/02(火) 12:42:06いいでしょう?
0798名無しさん@お腹いっぱい。
2005/08/02(火) 12:42:330799名無しさん@お腹いっぱい。
2005/08/02(火) 13:38:30tail -r
0800名無しさん@お腹いっぱい。
2005/08/02(火) 23:45:18ひねくれ者め(笑)
0801名無しさん@お腹いっぱい。
2005/08/03(水) 00:25:160802名無しさん@お腹いっぱい。
2005/08/03(水) 00:56:37実際のところ head で実現するのは苦しい気がする。
(head で指定できる行数は限りがあったと思うので。)
てことで
tail -<n> <file_name> > <tmp_file>
comm -23 <file_name> <tmp_file>
rm -f <tmp_file>
かな。
0803名無しさん@お腹いっぱい。
2005/08/03(水) 02:44:090804名無しさん@お腹いっぱい。
2005/08/03(水) 03:14:440805名無しさん@お腹いっぱい。
2005/08/03(水) 03:32:44last=100
rows=`wc -l file | cut -d ' ' -f 1`
head -n `expr $rows - $last` file
とか。
0806名無しさん@お腹いっぱい。
2005/08/03(水) 03:37:55は
wc -l < file
でいいだろ
0807名無しさん@お腹いっぱい。
2005/08/03(水) 07:23:57??
■ このスレッドは過去ログ倉庫に格納されています