お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2013-06-05 12:02:44

tktktk
新しいメンバ
登録日: 2013-06-05

mkdir, cpコマンドでのディレクトリの指定方法

初めまして、Linuxを使い始めて1ヶ月の初心者tktktkと申します。Linux 12.04 LTSを使用しております。
ソフトウェアの開発で、Freescale社より提供されたスクリプト(Perl言語)を利用してubuntu上で実行しています。
その中で、mkdirやCPコマンドでのディレクトリの記述が次のようになっており、スクリプト実行結果も意図した物にはなりませんでした。
大変初歩的な質問で申し訳ありませんが、効率的な対処方法がありましたら教えて頂きたくお願い致します。

記述例:(ファイル名やディレクトリ名は若干簡略化しています)

mkdir -p /home/tktktk/tmp//opt/freescale//opt/freescale/usr/bin
cp -a abc /home/tktktk/tmp//opt/freescale//opt/freescale/usr/bin

最初のmkdirでは、3つのディレクトリを作成しているのだと思います。
/home/tktktk/tmp/
/opt/freescale/rootfs
/opt/freescale/usr/bin

そして次のcp実行にて、3つのディレクトリにabcというファイルをコピーしているのだと思います。
/home/tktktk/tmp/abc
/opt/freescale/rootfs/abc
/opt/freescale/usr/bin/abc

なのですが、結果は次のように1つのディレクトリ作成とそこへのコピーなってしまいます。
/home/tktktk/tmp/opt/freescale/rootfs/opt/freescale/usr/bin/abc

この後abcファイルが見つかりませんというエラーが発生してしまいます。

このような複数のディレクトリを指定する時、//でつなげる記述方法はLinuxでは一般的なのでしょうか。
ちなみに //のかわりに/ /でスペースを入れるとうまくいきます。
但し、このような//記述は、たくさんのスクリプトト内でいたるところにありすべてスペースを入れて
修正すべきなのか悩んでおります。おそらくfreescale社提供の一般的なスクリプトですので他の方々も
そのまま使用されうまく行っていると思っています。

何か、良い対処方法が御座いましたら宜しくお願い致します。

オフライン

 

#2 2013-06-06 19:26:37

hellfire
メンバ
From: 日本/神奈川県
登録日: 2006-11-21

Re: mkdir, cpコマンドでのディレクトリの指定方法

tktktk 様へ。

今回のスクリプトの言語は何ですか?
文章を見る限り、Perl のような気もしますが、話の内容からするとシェルスクリプトな気もします。
スクリプトの最初の行の "#!" の後には何が書かれていますか?
また、そのスクリプトの置換等で編集をしませんでしたか?人為的なミスでスペースが消えたような気もします。

Linux では、// で繋げるというのは聞いたことがありません。
おそらく、スクリプトの意図していることは、
「/home/tktktk/tmp/」「/opt/freescale/」「/opt/freescale/usr/bin」を意図しているのではないでしょうか?
つまり、// で繋げているのではなく、ディレクトリ末尾の / とパスのはじめの / が重なっているだけかと。
なので、エディタで 「//」を「/ /」に置換することにより、大半の部分の問題は解決できると思います。

もし、そのスクリプトが誰でもダウンロード可能なのであれば、その URL を載せることでさらによい回答が得られると思います。

オフライン

 

#3 2013-06-07 11:51:01

tktktk
新しいメンバ
登録日: 2013-06-05

Re: mkdir, cpコマンドでのディレクトリの指定方法

hellfire様:

ご丁寧な回答ありがとうございます。

>今回のスクリプトの言語は何ですか?
>スクリプトの最初の行の "#!" の後には何が書かれていますか?

次の記述になっております。
#!/usr/bin/perl -w

このファイルは、installという名前で :~$ ./install で実行しています。
実行中の何が行われたかは、logファイルにより知ることができます。

このinstallファイルは、実行するにあたってlkc.specというファイルを参照しているようで
その中に次のような記述があります。

mkdir -p $RPM_BUILD_ROOT/%{pfx}/%{_prefix}/bin
cp -a abc $RPM_BUILD_ROOT/%{pfx}/%{_prefix}/bin

$RPM_BUILD_ROOT/ は、/home/tktktk/tmp/
%{pfx}/ は、/opt/freescale/rootfs
%{_prefix} は、/opt/freescale/usr
というように定義されており、/と%の間には、スペースがないことからhellfire様のご指摘のとおり結果的に
/home/tktktk/tmp//opt/freescale//opt/freescale/usr/bin という1つのディレクトリになっております。(logファイルの結果より)
このSPECファイルは編集しておりません。また、他にも同様な(/%間にスペースなし)記述が何箇所も見られます。

>もし、そのスクリプトが誰でもダウンロード可能なのであれば、その URL を載せることでさらによい回答が得られると思います。
Freescale社のURLで誰でもアクセス可能なのですが、ファイル自体1GBの圧縮されたファイルから手順書に従って解凍していき
上記のスクリプトファイルやSPECファイルを取り出すことになりますので、そこまでして頂くのは結構な時間が必要となります。

SPECファイルの作者に意図が聞ければ良いのですが、それは無理ですので、プロセスの結果をながめこの後行われる作業の内容の
意図を推測しながら、hellfire様のご提案にもありますがスペースを入れてみたり試行錯誤してみたいと思います。

お忙しい中、お時間を割いていただいて返答頂き誠にありがとうございました。また、進展がありましたらご報告したいと思います。

オフライン

 

Board footer

Powered by FluxBB