regex
  • bash
  • find
  • 2011-10-27 9 views 2 likes 
    2

    これはbashインストールスクリプト用です。スクリプトfoo.shは引数として "DIRECTORY"をとります。さあ、<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3とdir <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3という別のディレクトリがあります。UNIX "find"コマンドの使用

    スクリプト:foo.shを簡潔に示します。

    DIR='find $HOME -type d -name $1 | head 1' 
    if [ DIR is set to a directory ] 
    then 
        rm -rf $DIR 
    fi 
    exit 0 
    

    使用方法:スクリプトから今foo.sh TEST_3

    、唯一<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3を除去することができます。 <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3を削除するには、findコマンドでreg expを使用して、ディレクトリの競合を解決するために削除を微調整する必要があります。

    DIR='find $HOME -type d -regexp $1 | head 1' 
    

    以下の新しい使い方として、上記のスクリプトの検索部分を修正: foo.sh TEST_2B/TEST_3

    しかし、コマンドが<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3DIRセットの取得に失敗し、代わりに、結果として空&を返す「見つけます」 DIRは空で、決して削除することはできません<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

    どのようにしてスクリプトを変更することができますか? tはディレクトリ名だけでなく、ディレクトリへのパスにもNOの問題はありません。事実、一部のユーザは、 "foo.sh"の引数として部分的なディレクトリパスを与えるかもしれません。このような場合でも "foo.sh"が動作することを期待しています

    +1

    bashスクリプトのソースを投稿してください。私は非常に基本的な、たくさんの長いスクリプトを書いてきました。あなたの議論をエコーするのに役立つものはありません。 – octopusgrabbus

    答えて

    0

    これは意図したとおりに動作しませんか?

    find $HOME -type d -name $1 -exec echo {} ';' -exec rm -rf {} ';' 
    
    それはしかしtoher、それは大丈夫だ、いくつかの標準エラー出力に比べ、処理されたディレクトリの削除について文句を言うだろう

    ...

    あなたが示唆したように、「-regexp」の変更「-name」をOFCが、もしすることができますあなたは何かもっと複雑なものを望むなら、特別なスクリプトを作成して "-exec"から呼び出すことができます。

    EDIT: 私はおそらく初めて間違っていると思いますが(何も削除しないで、誰かを助けるかもしれません) TEST_3ディレクトリのうちの1つだけ(どのディレクトリから最初に見つけたものを選ぶのですか? - それはかなり奇妙に思えます)、私がpreviで提案したようにあなたが試みることができるのOU段落、あなたはすべての意思決定の世話をするどの-execするskriptを提供することができます)

    +0

    foo.sh TEST_3を使って "find"という出力を得て、常に<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3を削除します。部分的なパスをサポートするために "find"引数を適切に変更すると、 "foo.sh TEST_2B/TEST_3"はTEST_2B/TEST_3を削除すべきです – Mike

    2

    if [[ "$1" == */* ]]; then 
        EXPR="-path *$1" 
    else 
        EXPR="-name $1" 
    fi 
    DIR=$(find $HOME -type d $EXPR | head -1) 
    

    「TEST_3」のような単純な名前はfind -name TEST_3に翻訳するが、と名前になります「ST_2/TEST_3」のようなスラッシュはfind -path *ST_2/TEST3に変換されます。これにより、(部分的な)ディレクトリ名が処理されます。

    +0

    私はここで見つけるのに問題があります。私は "find"に部分的なパスの問題があると思います。たとえば、$(HOME)-path * ST_2B/TEST_3の検索ができますが、$(HOME)-path TEST_2B/TEST_3を見つけると何も得られません。奇妙な。私は部分パスもサポートする必要があります。パスを解決してパスを解決してから削除します。 – Mike

    +0

    @Mike:Findには問題はなく、あなたの期待は間違っています。 '-path'は_complete_パスを与えられたパターンと比較しました。したがって、 'xyz/TEST_2B/TEST_3'はあなたの引数' TEST_2B/TEST3'と比較されます。これは明らかに不一致です。 '*/TEST_2B/TEST_3'と比較すると、一致しています。 「部分一致」について:私の答えがあなたの望みでない場合は、それを編集して質問に明記してください。答えの中の長い議論は批判されます - これについてのFAQを見てください。 –

    +0

    2番目の説明では、-pathが期待していることがわかりました。ありがとうございます – Mike

     関連する問題

    • 関連する問題はありません^_^