Unixから最後のスラッシュ文字を削除する方法は?

Unixから最後のスラッシュ文字を削除する方法は?

このようなvlsiコードがあります。

instance1/instance2/instance3/and_gate_inst/and_gate/a_pin
instance1/instance2/or_gate/b_pin

これで、次の情報を入手するのに役立ちますか?

instance1/instance2/instance3/and_gate_inst/and_gate 
instance1/instance2/or_gate

混乱させて申し訳ありません。上記の質問は正解です。

ベストアンサー1

この行にパスが格納されているファイルを含むディレクトリへのパスを取得したいようです。

基本的なケースへの回答はすでに提供されていますが、一般的なケースで考慮すべきいくつかの点に言及します。

  • ほとんどのUnicesでは、ファイルパスはゼロ以外のすべてのバイトシーケンスで構成できます。これには改行を示すために使用されるバイトが含まれます。これには、有効な文字を形成しないバイトシーケンスを含めることができ、これはテキスト行が持つことができるLINE_MAX最大バイト数を定義する標準定数よりも長い場合があります。必要に応じて)とテキストユーティリティが正しく機能することが保証されます。

    したがって、この入力形式はファイルパスのリスト(たとえば、改行を含むファイルパスのリスト)を表すことはできません。改行がなく、LINE_MAXバイト未満のファイルパスリストの場合でも、Cロケールでテキストユーティリティを実行する必要があります。任意のバイト値を処理できます。

  • /パスコンポーネントの区切り記号ですが、

    • /alone は特別で、ルートディレクトリファイルを表します。いいえ目次ファイルが含まれますが、通常、通常、親ディレクトリはそれ自体であると言います。それにもかかわらず、入力に現れる可能性がある場合は、特に処理する必要があります。
    • /同様に動作する複数のシーケンスfoo//barは と同じですfoo/bar
    • 最初に正確に2つのシーケンスは除外されます//。これは///fooと同じです/fooが、//foo同じであることは保証されません/foo(一部のシステムではそうではありません)。より一般的には、..で始まるファイルの一般的な状況についてあまり知りません//。たとえば、/分離された各コンポーネントは、目次したがって、この場合何をすべきかを判断するのは困難です。
  • foo相対パスでもあります。親ディレクトリ.ではありません。空の文字列

  • ...実際のファイルよりもディレクトリナビゲーションツールに近いです。しかし、彼ら引用する実際のファイルには、ディレクトリ名または親ディレクトリについて何を報告する必要がありますか(..そして../..それぞれ?それとも.別の/-less相対パスが好きですか?)。

  • foo/bar/またはfoo/bar//少なくともディレクトリ自体foo/barの場合、foo/bar親ディレクトリはfoo

一つはない飼いならされた入力は次のとおりです。

//foo/bar
///foo//bar//
foo
foo//
.
../
foo<0x80>bar/baz<0x81>
--foo
/
//
///

問題を解決する1つの方法は、命令に従順でdirname明確な決定がない場合に決定を受け入れることです。

移植性の難しい部分は、行ベースの入力からパラメータを取得することですdirname

GNUシステムでは、次のことでこれを行うことができます。

xargs -rd '\n' -a your-file dirname --

GNU dirname8.30は以下を提供します:

//foo
///foo
.
.
.
.
foo<0x80>bar
.
/
/
/

ただし、次の理由で他のほとんどのシステムでは機能しません。

  • -dおよび/-rまたは-a非標準GNUxargs拡張
  • 一部のxargs実装は、テキストではなく入力によって中断されます。
  • dirname複数の主張を受け入れる必要はありません(そうする人はほとんどいません)。

実行中のコマンドの最大サイズパラメーターよりも長いファイルパスの場合、まだ失敗する可能性があります。

おすすめ記事