• ベストアンサー

シェルスクリプト中でシンボリックリンクのリンク先を比較したい

Leanの回答

  • Lean
  • ベストアンサー率72% (435/603)
回答No.2

No.1のお礼にあるようなシンボリックリンクのような場合だと下記のような感じでしょうか? $ ls --version ls (GNU coreutils) 5.97 Copyright (C) 2006 Free Software Foundation, Inc. This is free software. You may redistribute copies of it under the terms of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>. There is NO WARRANTY, to the extent permitted by law. Written by Richard Stallman and David MacKenzie. $ ls -lQ linktest lrwxrwxrwx 1 lean lean 16 9月 24 17:06 "linktest" -> "/tmp/link-> test" $ ls -lQ linktest | cut -d'"' -f4 /tmp/link-> test $ perl -e "print readlink './linktest' ;" /tmp/link-> test

zyousuke
質問者

補足

Leanさん、ご返信ありがとうございます。 lsに-Qオプションを指定するとファイル名を""で括って表示するのですね! この"を区切り文字としてcutに渡すとは、すごい巧妙な手法ですね! しかしLeanさんに考えていただいた、この手法にも弱点がありました。 それはユーザー名やファイル名に"が含まれていた場合です。 ユーザー名やファイル名に"が含まれていた場合、cutに渡すカラム数が変動し、 確実にリンク先情報を取得することは、できません。 もう1つ、考えていただいた手法は、私の要望にとても近いです。 すなわち、リンク先情報を取得する専用のコマンドを知りたいというものです。 readlinkがリンク先情報を取得するコマンドでしょうか。 しかし、このコマンドはシェルではなくperlが提供しているので、perlを呼び出して、その中で使用するということでしょうか。 perlの使い方はほとんど分からないのですが、次の認識で合っているでしょうか。 -eはperlをスクリプトとしてではなく1個のコマンドとして実行する場合に必要なオプションでしょうか。 -eを省略するとファイルがないというエラーになってしまいます。 そして実行するコマンド行は""で括らなければいけないのですね。 さらにreadlinkの引数は''で括らなければいけないのですね。 私が今作成しているシェルスクリプトはFILEという変数へフルパスのファイル名を代入してそれを次々評価する形式になっています。 お教えいただいたperlのコマンドを使ってこれをやろうとすると perl -e "print readlink '$FILE' :" となり、これを試したところうまくリンク情報を取得できました。 しかし、この手法も完璧とはいえず、ファイル名が'を含んでいた場合、エラーになってしまいます。 perlまたはreadlinkへ渡す前に$FILEが展開されてしまうのでしょうか。 ですのでperlを使用する場合はクォーティングを工夫する必要があり、すごい難しいと思いました。 そう言うわけで、今、私が選択肢として考えているのは No.1:ham_kamoさんのls -lとsedを組み合わせた手法を改良してみる No.2:Leanさんのls -lQとcutを組み合わせた手法を改良してみる No.3:当初私が考えたls -lとawkを組み合わせた手法を改良してみる です。 引き続き皆さんからの助言大募集です。 perlの情報も大募集です。 perlは学生時代に少し習ったのですが、うーん全然覚えてない。。。

関連するQ&A

  • シェルスクリプトだと動かない [ -L fileS ] && echo "シンボリックリンクです"

    コマンドライン上で カレントディレクトリにある fileS がシンボリックリンクであるか調べる事ができるか、学習しております。コマンドライン上で [ -L fileS ] && echo "シンボリックリンクです" と打つと、動作する事を確認しました。 しかし、シェルスクリプトで(slink.sh) ======================= #!/bin/sh [ -L fileS ] && echo "シンボリックリンクです" ======================= と、同ディレクトリにスクリプトファイルを作成。 chmod ug+x slink.sh して ./slink.sh と打つと slink.sh: test: 引数が足りません。 と怒られます。 どこがどのように間違っているかわからないので ご教授いただけないでしょうか お願い致します。

  • シェルスクリプト内でのsloginの使用

    複数のサーバにアップした同一ファイルについて、シェルスクリプトからsloginしてlsコマンドによる日付の目視確認をしたいと思っています。 ところが、シェルスクリプトで slogin -i 公開鍵 user@host を実行しても slogin: : Name or service not known と表示されて、コマンドが認識されないようです。 sshにしても、同様でした。 ちなみに、scpによるコピーはうまくいきます。 sloginはシェルスクリプト内で使えないのでしょうか?

  • perlスクリプト内でシェルコマンドを実行するには??

    タイトル通りなのですが、perlスクリプト内でシェルコマンドを実行させる方法が分からなく、困っています。 実行したいシェルコマンドはUNIXのcrontab なのですが・・。 また、perlスクリプト内以外でシェルコマンドを実行する方法はあるのでしょうか?? どなたか分かる方いらっしゃいましたらご教授いただけると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • PHPからシェルスクリプトを実行

    サーバ:XREA・CORESERVER PHPからシェルスクリプトを実行することは可能ですか? exec関数などがsafemodeでは動かないとのことなので、phpをcgiとして動かしているのですが、 どうもうまくいきません…。 というのも、lsなどのコマンドを実行しても、command not foundになってしまいます。 どなたか分かる方いらっしゃいますか?

    • 締切済み
    • PHP
  • シェルスクリプトで古いファイルの自動削除をするには?

    UNIXで以下の仕様を持つシェルスクリプトを作成しようと していますが、どうもうまくいきません。 どなたか、いい知恵を貸していただけないでしょうか? 目的: 特定のディレクトリ内にあるファイルについて、 システム日付より3日前のタイムスタンプを持つファイルを 削除する。 留意点: ・削除対象のファイルは複数存在する場合がある。 ・ファイルサイズは1件あたり 0byte-数百Mbyte となる  可能性がある。 ・ファイル名は不定。 ・スクリプトはBシェルまたはCシェルとする。 参考: ・現在使用しているOSについて  ls -l でのタイムスタンプにおける出力形式は以下のとおり  (デフォルト値?)  ・ 9月 28日 2000年    または   10月 24日 10時45分 知っている限りのコマンドを使っていろいろやってみたんですが、 結局ダメでした。 よろしくお願いします。

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • シェルスクリプト

    シェルスクリプトに関しては、まったくの初心者です。 OSは、SolarisとLinuxですが、シェルスクリプトを利用して下記のような自動実行プログラムを作りたいのですが、どなたかご教授下さい。 一台のWWWサーバのログ(例:access.log)を、1日に一回(出来ましたら朝の5時)に別サーバに送信するプログラムなのですがいかがでしょうか?このとき、出来れば送信先のファイル名は、送信した日付(例:20020222.log)にしたいです。説明不足かも知れませんが、ひとまずこれでお願いします。

  • シェルスクリプトをローカルで動作させるには

    cronジョブが使えるレンタルサーバーを使用しており、cronジョブから起動するshスクリプトを作ろうと思っています。 そこでシェルスクリプトを簡単に書こうと思っているのですが、プログラムはphpしかわかりません。勉強するためにはローカルで実行できる環境が必要だと思っています。 ネットでよく調べてみたのですが、シェルスクリプトをローカルで動作させる方法がわかりません。コマンドプロンプトから実行できたりしないんでしょうか?

  • シェルスクリプトの引数について

    test.sh '*.c' といったコマンドを入力した時に、 シェルスクリプト内で引数$1を受け取ったときに$1='*.c'となるのではなく、 カレントディレクトリ内にある'*.c'の正規表現にマッチするファイルが入ってしまっています。 例)カレントディレクト内にaaa.cファイルbbb.cファイルといったファイルがある時は、 $1=aaa.c bbb.cとなっています。 '*.c'の正規表現自体をシェルスクリプト内で受け取る方法はないのでしょうか? シェルはbashを使用しています。

  • シェルスクリプト 自身のファイルパスを取得する方法

    基本的なことかもしれないのですが、教えて下さい。 シェルスクリプトをLinuxで作成しています。 シェルスクリプトを実行して、実行したスクリプトまでの絶対パスを取得したいのですが、方法がわかりません。 いろいろ調べて、 dirname $0 という方法で出来るような記述も見つけたのですが、$0ではスクリプト名を取得することしか出来ず、ファイルパスを取得することが出来ませんでした。 OS : Linux カーネル : 2.6 です。 他に必要な情報があれば教えて下さい。 よろしくお願いいたします。