[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 21:40 / Filesize : 275 KB / Number-of Response : 969
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合@LINUX Part3



1 名前:login:Penguin [2007/07/10(火) 23:17:13 ID:qGthZdME]
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

【sed】シェルスクリプト総合@LINUX Part2【awk】
pc11.2ch.net/test/read.cgi/linux/1154578200/
pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。


237 名前:233 mailto:sage [2007/10/12(金) 17:40:09 ID:sUVuIX9s]
>>234
ごめん!間違った。
./shell.sh じゃなくて
. ./shell.sh でした。
. を打って1個スペース空けて シェルスクリプトファイル指定。

238 名前:login:Penguin mailto:sage [2007/10/12(金) 17:46:35 ID:5+kNLqtp]
>>237
なんで ./ を付けるの?

239 名前:login:Penguin mailto:sage [2007/10/12(金) 17:59:22 ID:+Kk0eMQd]
Yeah!めっちゃホリデイ

240 名前:login:Penguin mailto:sage [2007/10/15(月) 14:50:05 ID:NjtHefoB]
特定のURLを一定時間に読み込むシェルスクリプトをつくりたいのです。
今のところwgetを使ってwget hogehoge をクーロンで動かす予定ですが
もっとスマートなやりかたはありますか?

241 名前:login:Penguin mailto:sage [2007/10/15(月) 22:15:04 ID:yaqxWPIK]
>>240
それでいいんじゃね?

242 名前:login:Penguin mailto:sage [2007/10/15(月) 23:35:58 ID:6xnjJ9Cn]
>>241
じゃあ1分に1回よりも高頻度(30秒に1回とか、15秒に1回とか) やりたい場合はどうすれば?

243 名前:login:Penguin mailto:sage [2007/10/16(火) 00:24:31 ID:7lwU6GvW]
アタックしたいのか?

244 名前:login:Penguin mailto:sage [2007/10/16(火) 01:36:38 ID:IhGBMLbJ]
>>242
wget ...; sleep 30; wget ...
するスクリプトを毎分実行するとか。

245 名前:login:Penguin mailto:sage [2007/10/16(火) 08:18:30 ID:a72PxkLH]
>>243
アタックしたいわけじゃないですよ。
ただcronって最高でも1分に1回しか実行できないはずなので、それよりももっと短い間隔で
処理をさせたい場合とかどうするのかなぁとふと疑問に思ったもので。

>>244
なるほど・・。 しかし wget ... ; のところで1分ぐらい処理に時間がかかった場合
その後の sleep 30 ; がきて、そしてまた wget ... がくるから、タイミングと言うか場合によっては
30分に1回キッチリ実行されるとは限りませんね。31分かかって、その後実行されて
今度は29分後に実行されるみたいなズレ方はしますよね。



246 名前:login:Penguin mailto:sage [2007/10/16(火) 08:26:34 ID:IhGBMLbJ]
>>245
バックグラウンドで実行するとか。
つーか、何分もかかる処理を30秒ごとに実行していいのか?

247 名前:login:Penguin mailto:sage [2007/10/16(火) 11:46:31 ID:wfMufGFC]
cronはプロセスが無限増殖するのを抑えるために、同時実行数に制限があるので注意
Solarisだと、確か同時実行数が100個を超えるとそれ以降は時刻が来ても起動しなくなる
LinuxだとOOMキラーが動いて刈り取られるかもしれん

cronの起動間隔 ≒ プロセスの実行時間

となるような長めのプロセス、特に通信関係とかで長めのタイムアウトが発生しそうな
プロセスをcronに仕込むときは、注意したほうがいい

248 名前:229 mailto:sage [2007/10/16(火) 13:58:23 ID:EtpWijek]
環境が手元にないもので、遅レスになってしまいすみません。

>>235
なるほどです。ありがとうございました。
>>236
ありがとう。aliasでも出来そうでした。
>>237
.の後に続けて入力したところ、うまくcdできました。

>>238
素人なのでよく分かりませんが、実行ファイルを実行するときに付けるんでは?

それでは、みなさんありがとうございました。

249 名前:login:Penguin mailto:sage [2007/10/16(火) 14:09:44 ID:IhGBMLbJ]
>>248
. shell.sh
でもいっしょだよ。
やってみ。

250 名前:login:Penguin mailto:sage [2007/10/16(火) 17:45:32 ID:a72PxkLH]
./ を つけるのは カレントディレクトリのファイルを指定する為。

つけないと 環境変数 $PATH の中から該当する物が無いかを探してなかったら
エラー返すので。 カレントディレクトリのファイルを指定する時にいちいち
./ をつけるのが面倒だからって $PATH に ./ も含めてしまうとセキュリティホールになるので
やらないでね。

251 名前:login:Penguin mailto:sage [2007/10/16(火) 17:50:59 ID:IhGBMLbJ]
>>250
>>249

252 名前:login:Penguin mailto:sage [2007/10/16(火) 18:39:11 ID:tU6zGUOB]
シェルスクリプトで端末の現在の行数を得るにはどうしたらいいですか

253 名前:login:Penguin mailto:sage [2007/10/16(火) 19:18:04 ID:iHfKM46h]
stty -a とかかな。

254 名前:login:Penguin mailto:sage [2007/10/16(火) 19:45:06 ID:tU6zGUOB]
>>253
情報ありがとうございます。
行数を表示するだけでなくて、
シェルスクリプトの中で行数を変数に格納して、
なんらかの処理を行いたいと思っているのですが
何かうまい方法はありますでしょうか

255 名前:login:Penguin mailto:sage [2007/10/16(火) 21:12:10 ID:pdm4T3SF]
>>254
ROWS=`stty -a | tr ";" "\n" | grep rows | sed "s/.*rows //"`



256 名前:login:Penguin mailto:sage [2007/10/16(火) 21:36:05 ID:tU6zGUOB]
>>255
できましたありがとうございました。

257 名前:login:Penguin mailto:sage [2007/10/16(火) 23:32:43 ID:sWAUZpv3]
$LINES じゃだめなの?

258 名前:login:Penguin mailto:sage [2007/10/17(水) 04:58:42 ID:d5Vjha9K]
シェルスクリプトの中で$LINESがとれるとでも?

259 名前:login:Penguin mailto:sage [2007/10/17(水) 10:00:57 ID:9KXOUzKW]
ROWS=`tput lines`
COLS=`tput cols`


260 名前:login:Penguin mailto:sage [2007/10/17(水) 22:15:42 ID:VuOM9tU/]
eval `resize`
echo $LINES $COLUMNS


261 名前:login:Penguin mailto:sage [2007/10/18(木) 12:39:19 ID:fyMSNeWa]
>>260
resize は X がインストールされていない環境では使えない。
xterm の付属物なので。

262 名前:login:Penguin [2007/10/23(火) 17:14:39 ID:OMh5qn/O]
ちょっと相談に乗ってください。

日付.pc名.サイト名_access_log
ex)
20071023.pc-local01.hoge_access_log
20071023.pc-local02.hoge_access_log
20071023.pc-local01.hagehoge_access_log
20071023.pc-local02.testhoge_access_log

と言うログファイルをサイト名別のフォルダに移動した後
1つのログファイルにマージさせるスクリプトを書きたいのですが。
とりあえず、スクリプト書いてみたのですが正直何がなんだか
分かりません。アドバイスを下さい。


#!/bin/sh
timestamp=`date +%Y%m%d`
log=`find /home/hoge/log -name $timestamp.*`
list=`echo "$log" | sed -e 's/_access_log//g' | cut -c57-`

スクリプトでは、今日のタイムスタンプを取ってlogファイルを検索し
その結果のサイト名以降の”_access_log”を消して、サイト名より前
も入らないので、表示させないようにする。これから、サイト別にフォルダを
作ってそこに移動させるのですが、mkdir "$list"では上手く行きません。
何かいいアドバイスを教えてください。よろしく御願いします。

263 名前:login:Penguin mailto:sage [2007/10/23(火) 17:19:48 ID:4jX2ZQqu]
>>262
cut -c57- ってのは何?

264 名前:login:Penguin mailto:sage [2007/10/23(火) 17:20:31 ID:XqFIvlF4]
>>262
シェルスクリプト以前の話だな。
まずは最終的に何をやりたいのかをはっきりしろ。

265 名前:login:Penguin mailto:sage [2007/10/23(火) 17:26:06 ID:4jX2ZQqu]
>>262
$log にたくさんファイル名が入ってるのに
echo $log をいじろうとするのがよくわからんな。

>>264
まずは日本語の勉強からだな。



266 名前:login:Penguin mailto:sage [2007/10/23(火) 17:50:56 ID:OMh5qn/O]
>>263
サイト名だけの文字を取りたかったので、cut -c57- としました。

>>264
申し訳御座いません。
ログファイル名からサイト名だけを文字を取り出して、取り出した文字
(サイト名)のフォルダを作って、作ったフォルダにそれぞれログを
振り分けてログファイルをマージさせたいです。
これで、少しは伝わりますでしょうか?

>>265
$logの結果からサイト名の文字だけ取りたかったので、echo $logを
いじっています。

267 名前:login:Penguin mailto:sage [2007/10/23(火) 18:08:13 ID:XqFIvlF4]
>>266
プログラミングの論理部分を勉強したほうがいい。
「やりたいこと」と「実際のスクリプト」の間には
「ロジックを組み上げる」作業が必要になるが、
君はこの部分について全く理解できていないようだ。

まずは
「findで検索したファイルの一覧はどういう形で変数logに入っているのか」
「その変数logに対して繰り返し処理を行なうにはどうしたらよいか」
を調べてくるべし。

268 名前:login:Penguin mailto:sage [2007/10/23(火) 18:09:14 ID:4jX2ZQqu]
そもそも find でうまくいかんな。

269 名前:login:Penguin mailto:sage [2007/10/23(火) 18:17:19 ID:OI+rqPpl]
>>262
find . -type f -printf %f\\n|awk -F. '{gsub(/_access_log/,"",$3);print $2 "." $3}'|uniq >hostlist
for i in $(cat hostlist);do mkdir $i;done
あとawkで同じように
cp 20071023.pc-local02.testhoge_access_log pc-local02.testhoge
のようなlist作って実行

270 名前:login:Penguin mailto:sage [2007/10/23(火) 18:18:51 ID:OMh5qn/O]
>>267
アドバイスありがとうございます。
正直、インフラ担当なのでプログラムさっぱりです(;´Д`)
とりあえず、ググって調べてみます。

>>268
もう少し調べてから、スクリプト書き直します。
ありがとうございました。

271 名前:login:Penguin mailto:sage [2007/10/23(火) 18:20:53 ID:OMh5qn/O]
>>269
ありがとうございます。
参考にさせて頂きます。とりあえず、スクリプト周りを調べて
書いてみます。

272 名前:login:Penguin mailto:sage [2007/10/23(火) 18:25:49 ID:4jX2ZQqu]
#!/bin/sh
cd /home/hoge/log
for i in `date +%Y%m%d`.*; do
dir=`echo $i | cut -f2 -d.`
[ -d $dir ] || mkdir $dir
mv $i $dir
done

ファイル数が多過ぎるとかヘンなファイル名とかは知らね。

273 名前:login:Penguin mailto:sage [2007/10/27(土) 10:44:25 ID:mm4VeEeL]
IPアドレスを16進に変換したいです。
どうやりますか?

274 名前:login:Penguin mailto:sage [2007/10/27(土) 13:17:13 ID:D/VUEDKM]
echo '192.168.0.1' | gawk -F. '{printf("%02x%02x%02x%02x\n", $1, $2, $3, $4)}'

275 名前:login:Penguin [2007/10/27(土) 13:26:52 ID:QMQXG4ov]
>>274
俺のIPサンプルに使うなよ。晒されたら攻撃の的になるだろうが(´・ω・`)



276 名前:login:Penguin mailto:sage [2007/10/27(土) 13:35:53 ID:6kGxUA5U]
>>274
ありがとうございました。

277 名前:login:Penguin mailto:sage [2007/10/27(土) 14:33:40 ID:NSYPc3Nw]
>>275
ネットに繋がらないと思ったらお前のせいかー!
早く俺のIP返してくれよ(´・ω・`)

278 名前:login:Penguin [2007/10/27(土) 15:34:59 ID:XQQiaIjq]
>>275
そうか、そんなにお望みなら今から的にしてやるよwww
タシロ砲とブラスターとあと手持ちの攻撃ツールの標的IPを全部セットして攻撃開s


279 名前:login:Penguin mailto:sage [2007/10/27(土) 19:24:46 ID:OFawlVSO]
俺のIPは127.0.0.1だから攻撃するなよ

280 名前:login:Penguin mailto:sage [2007/10/27(土) 21:20:28 ID:jIwdHtQL]
ひどいネタスレと化してるなココwwwwww

281 名前:login:Penguin mailto:sage [2007/10/29(月) 10:48:36 ID:AXA/ueYo]
俺のIPは172.31.0.1だぞ。

282 名前:login:Penguin mailto:sage [2007/10/29(月) 10:55:37 ID:PqFYrP+5]
もういいよ。

283 名前:login:Penguin [2007/10/29(月) 11:01:37 ID:F/RFN0ba]
俺のIPは203.・・・・

いややめとく

284 名前:login:Penguin mailto:sage [2007/10/29(月) 18:16:52 ID:lN+2vPd7]
じゃあオレも1個

オレのIPは
169.254.88.24だぞ。

285 名前:login:Penguin mailto:sage [2007/10/29(月) 20:28:52 ID:vqPZDaQA]
あ、思い出した。
255.255.255.255 -> 0xffffffff
のように、IPv6表記を16進表記に変換する手続きを考えてくだちい。
f000::1 -> 0xf0000000_00000000_00000000_00000001 ("_"は不要)
ff::169.254.88.24 -> 0x00ff0000_00000000_00000000_a9fe5818



286 名前:login:Penguin mailto:sage [2007/10/29(月) 23:28:48 ID:Hdkrl+3D]
完全に他人まかせだなぁ。
> ruby -rsocket -e 'p Socket.gethostbyname("ff::169.254.88.24")[3].unpack("C16").map{|c|format "%x",c}.join'
"00ff00000000000000000000a9fe5818"

287 名前:login:Penguin mailto:sage [2007/10/30(火) 21:40:02 ID:Hmkhn1Qf]
あー、目鱗。
gethostbyname()等を使えばいいのか。

288 名前:login:Penguin mailto:sage [2007/11/06(火) 00:15:33 ID:vKEt0xzk]
あるコマンド(hoge)の結果が・・・

(カラム位置) [col1 col2 col3 col4]
(コマンド出力) 0001 0002 * 0004

である場合にこの結果をset `hoge`で受けた場合、位置変数
$3に「*」が入ってくるようにbashのスクリプトを作成したい
のですが現状ではどうやってもカレントディレクトリ配下の
ファイル一覧が入ってきてしまいます。

何か良い手がありましたら教えて下さい。

289 名前:login:Penguin mailto:sage [2007/11/06(火) 00:55:19 ID:M5wBEVHJ]
"`hoge`"

290 名前:login:Penguin mailto:sage [2007/11/09(金) 03:25:37 ID:r4+4tELy]
>>289
オイオイ!w
マジレスすると
$ set -o noglob
じゃないの

291 名前:login:Penguin mailto:sage [2007/11/09(金) 06:12:20 ID:BEUM5jSj]
>>300
zenity を使うとシェルスクリプトで手軽な GUI が作れるぞ

292 名前:login:Penguin mailto:sage [2007/11/09(金) 08:21:31 ID:kDM6jkym]
ttp://www.google.co.jp/search?hl=ja&q=zenity
でトップに出て来るページは、もしかしてケンカを売ってますか?
>最新のGnomeデスクトップを使っていても古いUnixユーザーはすぐにターミナルエミュレータを開いてしまいがちです。

293 名前:login:Penguin mailto:sage [2007/11/09(金) 12:05:22 ID:ei55nGr2]
文章全体から見てポジティブな物言いだと思うが...

294 名前:login:Penguin mailto:sage [2007/11/10(土) 01:20:06 ID:5ErO5tFm]
zenity の使用例: jpg と mp3 をあわせて avi を出力するスクリプト
音声ファイルをビデオホスティングサイトに投稿時に使用

====================================
#!/bin/sh
# mp3jpg2avi.sh

JPG_FILE=`zenity --title="JPG ファイルを選択してください" --file-selection`
MP3_FILE=`zenity --title="MP3 ファイルを選択してください" --file-selection`
zenity --title="質問" --question --text "変換開始しますか?"
if [ $? = 0 ];
then
 ffmpeg -shortest \
  -loop_input -f image2 -i $JPG_FILE \
  -i $MP3_FILE \
  -sameq output.avi
fi
====================================

295 名前:login:Penguin mailto:sage [2007/11/10(土) 09:47:24 ID:9Zj/zooJ]
>>292
Linuxから入った人だけど、Gnomeなんてマルチウインドウ端末エミュレータ支援ソフト西か見えません



296 名前:login:Penguin mailto:sage [2007/11/10(土) 11:07:23 ID:vw7Wu+HW]
マルチウインドウ端末エミュレータ支援ソフト西やら
マルチウインドウ端末エミュレータ支援ソフト力石やら
マルチウインドウ端末エミュレータ支援ソフトホセ=メンドーサやら知らん。

297 名前:login:Penguin mailto:sage [2007/11/10(土) 11:19:14 ID:9Zj/zooJ]
>>296
一応ここでタオル投げときますね。つ〜

298 名前:login:Penguin mailto:sage [2007/11/10(土) 18:43:49 ID:Skjd8N2z]
そういやこの間表参道歩いていたら、
胸にでっかく

「マンモス西」

と書かれたTシャツを着たガイジンが
前からいきなり歩いてきてビビった。

東京は怖い街だよ。

299 名前:login:Penguin mailto:sage [2007/11/10(土) 19:19:41 ID:PRddAKpB]
そんなアナタに
engrish.com/

300 名前:login:Penguin mailto:sage [2007/11/10(土) 20:24:35 ID:Skjd8N2z]
そこのこの写真に、"Photo courtesy of Paul Gilbert"ってあるけど、
あのポールギルバートなんだろうか?

ttp://www.engrish.com/detail.php?imagename=Hate.jpg&category=Clothing&date=2001-11-03

日本に住んでたしなあ。

301 名前:HhMiKdKNVb mailto:vyqkae@ndzhjf.com [2007/11/12(月) 01:38:17 ID:J0HpIKvZ]
hlUotX <a href="jtpkztrjwlma.com/">jtpkztrjwlma</a>, [url=ykcooubrqrga.com/]ykcooubrqrga[/url], [link=tvapeckiqvbf.com/]tvapeckiqvbf[/link], cygdvmjubaqg.com/

302 名前:login:Penguin mailto:sage [2007/11/13(火) 02:33:43 ID:tnRwnYpT]
恥を忍んで質問なのですが

/home/me/ 以下にjpgファイルが数千有ります
中身はこんな感じなのですが
1082053423922.jpg
1082053508305.jpg
1082053537535.jpg
1082053614971.jpg
1082053699948.jpg
1082053732609.jpg
1082053763346.jpg
1082391828601.jpg
1082392563669.jpg
1083091232922.jpg

この数千の*.jpgのファイルをディレクトリから読み込んで以下タグの中にディレクトリから読み
インクリメンタルに全ての画像ファイルがリンク代入された状態で出力したいと思っています

<div id="myGallery">
<div class="imageElement">
<h3>Item 1 Title</h3>
<p>Item 1 Description</p>
<a href="mypage1.html" title="open image" class="open"></a>
<img src="images/foo/a.jpg" class="full" />
<img src="images/foo/a-thum.jpg" class="thumbnail" />
</div>

ディレクトリから読み込んだfileの名前a.jpgににファイルの中が無くなるまで
置換したいという意味なのですが..
どうか、助言願えないでしょうかm(__ __)m

303 名前:login:Penguin mailto:sage [2007/11/13(火) 07:47:54 ID:xB6HVDtO]
まずは「この数千の……」以降の文章を推敲して他人に理解できるよう
書き換える。

304 名前:login:Penguin mailto:sage [2007/11/13(火) 10:11:50 ID:VZT+kd7x]
>>302
zphoto でも使ったら?

305 名前:login:Penguin mailto:sage [2007/11/13(火) 12:34:27 ID:v1//zET/]
こういうことか?

for f in `ls -1 /home/me`                         ; do echo '<img src="images/foo/'$f'" class="full" />'; done
for f in `ls -1 /home/me | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done



306 名前:302 mailto:sage [2007/11/13(火) 14:02:39 ID:tnRwnYpT]
>>303
深夜に回転数が落ちていまして申し訳ないですm(_ _)m

>>304
それも考えたのですが、出来ればこちらの方が良いなと思いまして..

>>305
バッチリ書き出せました、もの凄い感謝なのですが
thumとthum無しのイメージが交互に書き出すことが出来ると思います
教えていただいた物を各ディレクトリに置き換えたものが以下の物なのですが

for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<img src="images/foo/'$f'" class="full" />'; done
for f in `ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
1行目と2行目を並べて出力できるように努力したのですが...
gawkの部分で引っかかってしまいます、というか1行目しかループしてくれません(T.T)
補足いただければと思うのですが、よろしくお願いします マジ感謝感激です
shell sciptとawkの本もamazonしようと思っています

307 名前:302 mailto:sage [2007/11/13(火) 14:19:58 ID:tnRwnYpT]
もうちょっとで出来そう...

308 名前:302 mailto:sage [2007/11/13(火) 15:05:30 ID:tnRwnYpT]
出来ました ありがとうございましたm(__ __)m

309 名前:login:Penguin mailto:sage [2007/11/13(火) 15:14:48 ID:MuKLiZO1]
最終的にどうやりましたか?
報告して下さい。

310 名前:302 mailto:sage [2007/11/13(火) 15:32:02 ID:tnRwnYpT]
ディレクトリを作りthumnail入れてこれで出力できました

for f in `ls -1 /www/web_dir/photo_album/images/foo/`;

do
echo '<div id="myGallery">';
echo '<div class="imageElement">'
echo '<h3>Item 1 Title</h3>'
echo '<p>Item 1 Description</p>'
echo '<img src="images/foo/'$f'" class="full" />';
echo '<img src="images/foo-thum/'$f'" class="full" />';
echo'</div>';
echo ' ';

done

311 名前:login:Penguin mailto:sage [2007/11/13(火) 15:42:18 ID:MuKLiZO1]
ちなみにサムネールは thumnail じゃなくて thumbnail ね。

312 名前:302 mailto:sage [2007/11/13(火) 16:02:23 ID:tnRwnYpT]
はい、ありがとうございました^^

313 名前:login:Penguin mailto:sage [2007/11/13(火) 18:23:44 ID:v1//zET/]
>>306
ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'

ここだけ実行するとどうなるの?

314 名前:login:Penguin mailto:age [2007/11/16(金) 18:50:01 ID:q8UeZNS0]
ls -d /a/b/c/d/*/

のようにコマンドを打ち込むと
/a/b/c/d/hoge1
/a/b/c/d/hoge2
/a/b/c/d/hoge3
のように出力が帰ってきますよね。この中から
hoge1, hoge2, hoge3 の部分のみ、つまり ディレクトリ階層の一番深い部分のディレクトリ名
のみを得る為にはどうすれば良いのでしょうか?シェルスクリプト内で必要なのですが
分かりません。教えてください。

自分で調べた限りだと basename とか dirname がそれに近そうだったのですが、
ちょっと違うようです。他には見つけることが出来ませんでした。

315 名前:login:Penguin mailto:sage [2007/11/16(金) 18:54:10 ID:PPFIsM3H]
>>314
> のように出力が帰ってきますよね。
いいえ。



316 名前:login:Penguin mailto:age [2007/11/16(金) 19:44:27 ID:q8UeZNS0]
>>315
/a/b/c/d/hoge1
/a/b/c/d/hoge2
/a/b/c/d/hoge3

じゃなくて

/a/b/c/d/hoge1/
/a/b/c/d/hoge2/
/a/b/c/d/hoge3/

の間違いでした。 このリストから hoge1, hoge2, hoge3を抜き出したい。
hoge1/ の最後の "/" も切り落としてしまいたいのですが、どうすれば良いでしょうか?

317 名前:login:Penguin mailto:sage [2007/11/16(金) 19:51:40 ID:PPFIsM3H]
>>316
sed なり awk なりで切り出せると思うけど、
最初から
find /a/b/c/d -mindepth 1 -maxdepth 1 -type d -printf "%f\n"
とかじゃだめなん?

318 名前:login:Penguin mailto:sage [2007/11/16(金) 20:01:17 ID:gAB+KHmJ]
>>316
for i in ls -d /a/b/c/d/*/; do basename $i; done


319 名前:login:Penguin mailto:sage [2007/11/16(金) 20:10:36 ID:PPFIsM3H]
>>318
for i in `ls -d /a/b/c/d/*/`; do basename $i; done
と言いたいんだろうが、
for i in /a/b/c/d/*/; do basename $i; done
でいいな。
空白とか入ってなければ。

320 名前:login:Penguin mailto:age [2007/11/16(金) 20:14:17 ID:q8UeZNS0]
>>317
レスありがとうございました。
しかしfindコマンドに詳しくない為自分ではよく分かりません。それ・・・。

>>318
レスありがとうございました。
こちらの方法はまさに私が求めていた方法です。非常に分かりやすくて助かります。
本当にありがとうございます。

321 名前:320 mailto:age [2007/11/16(金) 21:33:37 ID:q8UeZNS0]
解決したと思ったのですが、

ROOT=/a # ←ココは何でもいい、とにかくディレクトリ
cd ${ROOT}

for DIR in `ls -d ./*/`
do
for TARG in `basename ${DIR}`
do
echo ${DIR}
echo "${TARG}"
done
done

といった感じにしてみたのですが、
Venus7.0 Personal Edition
といったディレクトリが
Venus7.0 と Personal と Edition の3つに分割されてしまい、そのディレクトリに対して
処理したいのに3つの存在しないディレクトリに対して処理しようとする為、 no such file or directory
エラーが次々と帰ってきました。
どうも ディレクトリ名に半角スペースが入っているのがダメなようです。解決策はありませんか?
ちなみに全角スペースの場合は1つのディレクトリとして正常に動作しています。

for DIR in `ls -d ./*/`   ←この部分で分断されてしまっていると思いますが
for DIR in `ls -d ./"*/"`  などと" " で囲んで見ましたが */ なんてディレクトリは見つからない
と怒られました。 ' ' で囲んでも同じ結果です。どうしたら半角スペースをセパレータとして
認識するのを防げますか?

322 名前:login:Penguin mailto:sage [2007/11/16(金) 21:43:34 ID:lBcVe9Af]
なんでそんなディレクトリがあるのか
を考えたほうが根本的な解決になりそう

323 名前:login:Penguin mailto:sage [2007/11/16(金) 21:44:56 ID:PPFIsM3H]
>>321
だから >>319 で言ったじゃん。

>>322
いや、あるときはあるでしょ。
そんなにおかしいことではない。

324 名前:login:Penguin mailto:sage [2007/11/16(金) 22:02:10 ID:lBcVe9Af]
わざわざ_使ってる人の意味を考えよう
>>321は''の囲み方が間違ってるだけだが
_があるのが普通って考えたほうが手間なくていい
windowsがらみならwindowsでやったほうがいい

325 名前:320 mailto:age [2007/11/16(金) 23:35:30 ID:q8UeZNS0]
>>322
ま、まぁ色々事情がありまして。あるんですよ。。。

>>323
>>319の事かと思ってレスを投稿する前に確認したのですが、

for DIR in ./*/
do
    for TARG in `basename "${DIR}"`
    do
        echo ${DIR}
        echo ${TARG}
    done
done

で確認したところ 変数DIRには正しく取れました。 しかし
`basename "${DIR}"` としているにも関わらず
元ディレクトリ名 AVG Anti-Virus Free Edition 7.3
実行結果
AVG
Anti-Virus
Free
Edition
7.3
とこのように分断されてしまいます。 " " で囲っているにも関わらず、です。
何がいけないのでしょうか?



326 名前:login:Penguin mailto:sage [2007/11/16(金) 23:59:15 ID:2bsqELIP]
#!/bin/sh

LIST="\"space aaa\" \"bbb\" \"space ccc\" \"ddd\"";
echo $LIST; # "space aaa" "bbb" "space ccc" "ddd"

func(){
echo "arg= $#"; #6
echo "$1"; # space
echo "$2"; # aaa
echo "$3"; # bbb
echo "$4"; # space
echo "$5"; # ccc
echo "$6"; # ddd
}

func $LIST;

上のようなスクリプトで
func には、"space aaa" みたいにスペースの入った引数を渡したいんですが、
なにか方法はないでしょうか? この場合funcにわたす引数を4つにしたいんです。
展開されて、引数が6つになってる。。。素人ですません。

327 名前:login:Penguin mailto:sage [2007/11/17(土) 00:44:46 ID:X3VLuMy8]
>>325
for TARG in `basename "${DIR}"` ->
for TARG in AVG Anti-Virus Free Edition 7.3


328 名前:login:Penguin mailto:sage [2007/11/17(土) 07:31:23 ID:FrK+lOPY]
>>326
$LIST をクォートする。

329 名前:login:Penguin mailto:sage [2007/11/17(土) 08:31:04 ID:tPTtgwaW]
>>328
これだけで良かったんですね。
3時間くらい悩んでたよ。d

330 名前:login:Penguin mailto:sage [2007/11/17(土) 09:32:44 ID:X3VLuMy8]
つeval

331 名前:320 mailto:age [2007/11/17(土) 10:54:12 ID:oelt9+66]
>>327
レスありがとうございます。

そうなんですよ、そんな風に展開されてしまうんですよ。
${DIR} だけを出力しても
./AVG Anti-Virus Free Edition 7.3
となるのに
"${DIR}" とダブルクォートで囲っても
./AVG Anti-Virus Free Edition 7.3
と全く同じ出力になってしまう。つまりダブルクォートが利いてない・・。
だからそれをどうすれば1つの文字列として扱えるのですか?空白を区切りとしないようにする為には・・・。

332 名前:login:Penguin mailto:sage [2007/11/17(土) 12:01:58 ID:dajSe2oX]
>331
basename の結果が正しいんだからダブルクォートは効いてるだろ?
その後、`` で置き換えた時には既に "${DIR}" とは無関係の文字列なんだから
直書きされてるのと同様に空白で分割されてるだけ。

あえて書くなら

for DIR in ./*/
do
    BASE=`basename "${DIR}"`
    for TARG in "${BASE}"
    do
        echo ${DIR}
        echo ${TARG}
    done
done

っていうか、なんで 2 段で for を回す必要があるのか。

333 名前:login:Penguin mailto:sage [2007/11/17(土) 12:23:43 ID:dh2GLbwy]
>>331
バッククォート内はコマンドの出力に置き換えされるんだから、その出力を
クォートすればいい。
for TARG in "`basename "${DIR}"`"

っていうか、なんで 2 段で…


334 名前:320 mailto:age [2007/11/17(土) 22:43:03 ID:oelt9+66]
>>332-333
な、なるほど・・・・
お二人の解説文を10回ほど読み直しながらじっくり考えてみた所、ようやく理解できました。
特に "`basename "${DIR}"`" はややこしくて 最初は何をかいているのだろうかと思いましたが
`basename "{DIR}"` の出力結果そのものを " " で囲っているわけですね。なるほどなるほど。
う〜ん、これは思いつかない・・・。発想力ですか・・・。

で、2段でfor回していますが、確かに冷静に考えると2段で回す必要はありませんね・・・。
むしろ2段で回す処理にしている事で複雑化してしまった感があります。
1段forでいけそうです。

335 名前:login:Penguin mailto:sage [2007/11/23(金) 15:28:58 ID:P7OyMgNI]
>326です。
拡張が必要になり、問題が増えました。

#!/bin/sh
echo $LIST; # "aaa aaa" "bbb" "ccc ccc ccc" "ddd"

func(){
〜処理〜
}

func "eee eee" "fff fff" "$LIST" "ggg ggg";

以下のようにfuncにスペースを含んだ形で
${LIST}とその他の値を同列に引数として渡したいのです。

↓funcに渡したい引数
"eee eee" "fff fff" "aaa aaa" "bbb" "ccc ccc ccc" "ddd" "ggg ggg"

>>328 >>330にあったように eval func で展開すると
LIST以外の引数がスペースで展開されてしまいます。

LIST以外の引数を "eee\ eee" とか"\"eee eee\""とする手で回避も可能ですが、
修正箇所が増えるので、極力この形は取りたくありません。
なにか方法はありませんか?



336 名前:login:Penguin mailto:sage [2007/11/23(金) 22:55:10 ID:rrMjYG9S]
Σ^)/アホーアホー☆ミ-

337 名前:login:Penguin mailto:sage [2007/11/23(金) 23:18:09 ID:OSmgQwJo]
uniqはsortしておかないとだめですが、
sortしなくても2回目意向の重複を削除するコマンド内ですか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef