Unixの "find"コマンドの使用法

This is for a bash installation script. The script foo.sh takes "DIRECTORY" as an argument. Say, there is a dir <$HOME>/TEST/TEST_1A/TEST_2A/TEST_3 and another dir <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3.

スクリプト: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

Usage: foo.sh TEST_3

Now from the script, only the <$HOME>/TEST/TEST_1A/TEST_2A/TEST_3 can be removed. To remove <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3, I need to use a reg exp in my find command, to fine tune the remove to resolve the directory conflict.

上記のスクリプトの検索部分を以下のように変更しました。

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

New usage: foo.sh TEST_2B/TEST_3

But "find" command FAILS to get the DIR set to <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3 and instead returns empty & as a result DIR is empty and I can never ever remove <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

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

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

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 。これにより、(部分的な)ディレクトリ名が処理されます。

2
追加された
私はここで見つけることに問題があります。私は "find"に部分的なパスの問題があると思います。たとえば、$(HOME)-path * ST_2B/TEST_3の検索ができますが、$(HOME)-path TEST_2B/TEST_3を見つけると何も得られません。奇妙な。私は部分パスもサポートしなければなりません。パスを解決してそれを削除する "find"
追加された 著者 Mike,
あなたの2番目の説明で、私は、-pathが期待するものを得て、それは私のために働くでしょう。どうもありがとう
追加された 著者 Mike,
@マイク:見つけることは問題がない、あなたの期待だけが間違っている。 -path 完全パスを指定パターンと比較したものです。したがって、 xyz/TEST_2B/TEST_3 は引数 TEST_2B/TEST3 と比較されます。これは明らかに不一致です。 */TEST_2B/TEST_3 と比べては一致しています。 「部分一致」について:私の答えがあなたの望みでない場合は、それを編集して質問に明記してください。答えの中の長い議論は批判されます - これについてのFAQを見てください。
追加された 著者 A.H.,
どういたしまして。 howtoの投票と回答の受け入れについては、 stackoverflow.com/faq#howtoask を参照してください。
追加された 著者 A.H.,

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

find $HOME -type d -name $1 -exec echo {} ';'  -exec rm -rf {} ';'

それは処理されたディレクトリの削除について不平を言うだろうが、いくつかのstderr出力よりもtoherですが、それは大丈夫です...

あなたは提案したように "-regexp"の "-name"を変更することはできますが、もっと複雑なものが必要な場合は、 "-exec"

編集: 私はおそらく間違った初めてのことを理解していますが(何も削除しないで、誰かを助けるかもしれません) - TEST_3ディレクトリのうちの1つだけを削除したいのです(どのファイルをどのように見つけるか?私は前の段落で示唆したように、あなたはすべての意思決定の世話をする-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を削除すべきです(SHOULD)。
追加された 著者 Mike,