2

名前の一部でフォルダを検索したいのですが、これは私が知っている、この種のフォルダによくあることです。私はこのようなbashスクリプトで「find」コマンドを使用しました

find . -type d -name "*.hg" 

現在のディレクトリから見つかったフォルダ自体へのパス全体を出力するだけです。フォルダ名に「.hg」があります。その後、「sed」コマンドを使用しようとしましたが、パスの最後の部分をアドレス指定できませんでした。フォルダ名の末尾を.hgにして変数に保存し、「sed」コマンドを使用して最後のディレクトリを出力から削除することにしました。私はこれを使って最後の部分を取得し、結果を変数に保存しようとしますが、運がありません。

find . -type d -name "*.hg"|sed 's/*.hg$/ /'


find . -type d -name "*.hg"|awk -F/ '{print $NF}

これはファイル名を出力するだけです。ここでは、末尾に.hgが付いたフォルダーです。それから私は別のアプローチを使用します

for i in $(find . -type d -name '*.hg' ); 
do
    $DIR = $(dirname ${i})
    echo $DIR
done

これも機能しませんでした。誰かが私にこれを機能させるためのヒントを教えてもらえますか?はい、それは宿題です。

4

3 に答える 3

1

パラメータ展開を使用できます:

d=path/to/my/dir

d="${d#*/}" # remove the first dir
d="${d%/*}" # remove the last dir
echo $d     # "to/my"
于 2013-03-23T06:23:33.380 に答える
0

sedスクリプトで使用しているパターンに問題があります。bashコマンドとfindコマンドの両方で使用されているパターン言語が異なります。

それらは非常に単純な正規表現言語を使用します。ここで、*は任意の数の任意の文字を意味し、?任意の1文字を意味します。sedコマンドは、はるかに豊富な正規表現言語を使用します。ここで、*は、前の文字と。の任意の数を意味します。任意の文字を意味します(それ以上のものがあります)。

したがって、findによって配信されたパスの最後のコンポーネントを削除するには、次のsedコマンドを使用する必要があります。sed-e's、/[^/]。hg,,'

または、dirnameコマンドを使用することもできます。findコマンドの出力をxargsにパイプします(コマンドに引数として標準入力を渡すコマンドを実行します:

xargs -i dirname

@Pamador-それは奇妙です。わたしにはできる。説明するだけです。sedコマンドは、不要なシェル拡張から保護するために、一重引用符で囲む必要があります。's'に続く文字はコンマです。ここで行っているのは、sedがsubstituteコマンドの2つの部分を区切るために使用する文字を変更することです。これは、前に円記号を付けずにスラッシュ文字をエスケープせずに使用できることを意味します。次の部分は、スラッシュ、任意の文字、hgを除いて、任意の文字シーケンスに一致します。正直なところ、パターンを$で行末に固定する必要がありましたが、それ以外は問題ありません。

私はそれをテストしました

echo "./abc/xxx.hg" | sed -e 's,/[^/]\.hg$'

そしてそれは./abcを印刷しました

私はあなたがやりたいことを誤解しましたか?

于 2013-03-23T11:31:43.443 に答える
0
find . -type d -name "*.hg" | awk -v m=1 -v n=1 'NR<=m{};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

awkパラメーター:

  • m=出力の先頭から削除する行数
  • n=出力の終わりから削除する行数

ボーナス:最後から1行を削除したいが、coreutilsがインストールされている場合は、次のようにすることができます。 find . -type d -name "*.hg" | ghead -n -1

于 2016-01-27T20:39:01.060 に答える