🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.perl
Article #133

Re: mkdirの -p オプション相当を実現するには?

#133
From: Kazuhiko Nanmei
Date: Tue, 21 Apr 1998 00:00
99 lines
4250 bytes
なんめい@東芝です。

大田@名古屋大学 さん
東 さん
稲葉 浩人 さん
入内島 健 さん

回答有難う御座いました。
(以下、読みづらいかもしれませんが・・・)


  In article <6fvo5c$jd9@ux37.fuchu.toshiba.co.jp>, kazuhiko.nammei@toshiba.co.jp says...
  >
  >実際使うコマンドは、mkdirでは無く、他の外部コマンドなんですが・・・
  >また、そのコマンドが、-pの様なオプションを実装してくれていなんで
  >困ったしだいです。

というのが、真意です。
質問の内容が伝わらずに、スミマセンでした。


 In article <38zphzq03h.fsf@gaea.ssel.toshiba.co.jp>, ken@gaea.ssel.toshiba.co.jp says...
 >
 >>>>>> inaba@st.rim.or.jp (Inaba Hiroto) (="稲") さん
 >>>>>>   <yaxo1aai.fsf@carnival.st.rim.or.jp> で
 >>>>>> 3 Apr 1998 01:02:49 +0900 に言われるには:
 >
 > nammei> mkdirの-pオプション相当を実現したいのですが、どんなふうに
 > nammei> 書けば良いんでしょうか?
 >...
 >>          @d = split m'/';
 >
 >>          for (@d) {
 >>            mkdir $_
 >>              unless -d $_;
 >>            chdir $_;
 >>          }
 >
 > 稲> この考え方でいいと思いますが、ちょっとだけ別のやりかたをしてみました。
 >
 >私のやり方は基本に忠実ではあったと思いますが、
 >
 > 稲> #/usr/local/bin/perl -w
 > 稲> for (@ARGV) {
 > 稲>   while (m:/|$:g) {
 > 稲>     mkdir $`, 0777 or die "Can't mkdir $`: $!\n" if $` ne "" and !-d $`;
 > 稲>   }
 > 稲> }
 >
 >また、目から鱗が落ちました。稲葉さんのコードを見ていると、自分にとって
 >はまだまだ perl が外国語なのを思い知ります。
 >
 >m//g を list context で使えば split は使わずに済んでしまうんですね。し
 >かも、$` を使えばいちいち chdir する必要がない、と。
 >--


う~ん。(?_?)
私には???(解釈できません)です。(T_T)
修行が足りなくて、ごめんなさいm(__)mです。

健さん のなら、何とか解る気がしますが、
実際にしたい事は、mkdirじゃなくて、他の外部コマンドなので、
system()で実行するとしたら・・・、
そうそう、ディレクトリが既存であるかを確認するのにも、lsコマンド相当のもの
を使うしか手立てが無いんです。(test文?が使えない)

●ディレクトリを作るには・・・
 system("MKDIR $_ >/dev/null 2>&1") ; #←「MKDIR」は、/bin/mkdirと同様の振る舞い・・・
 MKDIRのリターン値によって「0:成功」「それ以外:失敗」。

●ディレクトリが既存か、確認するには・・・
 system("LS -d $_ >/dev/null 2>&1") ;  # ←「LS」は、/bin/lsと同様の振る舞い・・・
 LSのリターン値によって「0:成功(既存)」「それ以外:失敗(存在しない)」。

という具合です。

私なりに書いてみたのが、以下です。
------------------------------------------------------
#! /usr/local/bin/perl
$path = "" ; パスの初期化

#     ↓実用適にはARGVを使うのが良いんですが、サンプルという事で・・・
$_ = '/hoge_top/a/b/c' ;
@d = split m'/';

for (@d) {
  $path = join("/", $path , $_ );
  $path =~ s#/+#/#g ;
  system("MKDIR $path >/dev/null 2>&1") if system("LS -d $path >/dev/null 2>&1") ;
}
------------------------------------------------------

エラーなどについて、一切考慮してないことを除けば、
期待した動きをしてくれています。

それも、全て、助言して下さった皆さんのお陰だと感じています。
本当に有難う御座いました。m(__)m
Technical Details
Message-ID: <6hhk95$fjc@ux37.fuchu.toshiba.co.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6fvo5c$jd9@ux37.fuchu.toshiba.co.jp> <38vhss3235.fsf@gaea.ssel.toshiba.co.jp> <6g063d$475$1@meshsv66.os.mesh.ad.jp> <yaxo1aai.fsf@carnival.st.rim.or.jp> <38zphzq03h.fsf@gaea.ssel.toshiba.co.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 1043e7,35a2f9c0f0c5150f
X-Google-Attributes: gid1043e7,public
From: kazuhiko.nammei@toshiba.co.jp (Kazuhiko Nanmei)
Subject: Re: mkdirの -p オプション相当を実現するには?
Date: 1998/04/21
Message-ID: <6hhk95$fjc@ux37.fuchu.toshiba.co.jp>
X-Deja-AN: 346249083
References: <6fvo5c$jd9@ux37.fuchu.toshiba.co.jp> <38vhss3235.fsf@gaea.ssel.toshiba.co.jp> <6g063d$475$1@meshsv66.os.mesh.ad.jp> <yaxo1aai.fsf@carnival.st.rim.or.jp> <38zphzq03h.fsf@gaea.ssel.toshiba.co.jp>
Content-Type: Text/Plain; charset=ISO-2022-JP
Organization: Fuchu Works, TOSHIBA Corp.,Japan
Mime-Version: 1.0
Newsgroups: fj.lang.perl