2017-05-11 2 views
2

名前が付けられていて、私はこの名前のディレクトリを作るはずです。このディレクトリがすでに存在する場合は、フォルダの名前に接尾辞として_ $ numberを付ける必要があります。新しいフォルダのインデックスを見つける

数が最高値+ 1の例のように計算されます。

名前:素晴らしい
ファイル:
新しいフォルダdummy_3ダミー素晴らしいawesome_2のawesome_4:awesome_5

名前:素晴らしい
ファイル:ダミーダミー_
新しいフォルダ:awesome

最高値を見つけるための私のソリューションは、特殊文字のない名前に対してのみ機能します。名前は、たとえば次のようになります。 "!$#& *(%+#$ asdasd \ ^悲しい(@)"、それは

function max_item() { 

    local prefix="$1" 
    local max="0" 

    shopt -s nullglob 

    for in_file in * ; do 
     if [[ "$in_file" =~ ^"$prefix"_(-{0,1}[0-9][0-9]*)$ ]]; then 

      num="${BASH_REMATCH[1]}"; 
      [[ "$max" -lt "$num" ]] && max="$num"; 

     fi 
    done 

    echo "$max" 
    shopt -u nullglob 
    return 0 
} 

私はそれが特別に何かを持っていると思います失敗します正規表現の文字が、私はすべての私の考えを使い果たしてしまった

+2

どのように関数を呼び出しますか? – 123

+1

パフォーマンスヒント:for f in *の代わりに、$ {prefix} _ "*'で 'for f 'を使用すると、無駄な反復処理が大幅に削減されます。 – Jens

答えて

2

あなたが_で始まる名前の末尾の数字、探しているので、あなたの代わりにこれを行うことができます:。

max=0 
number='^[[:digit:]]+$' 
for in_file in "${prefix}_"* ; do 
    num="${in_file##*_}" 
    [[ "$num" =~ $number ]] && [[ "$max" -lt "$num" ]] && max="$num" 
done 

num=$((max + 1)) 

私は、@ Jensの優れた提案を取り入れて、ちょうど一致するファイルをループしました。

+1

123が正しかった、私は間違って接頭辞を渡していた、私の機能は基本的に働いた、私はちょうどそれを間違って...しかし、@ジェンスのパフォーマンスの改善とあなたのソリューションははるかに優れていると私は、 – PesaThe

2

シェルコードのループは非常に遅いです。 小さな番号について

、(正確な数は多くの要因に依存する)、以下外部ユーティリティベースのソリューションがより速くなるとより良いスケーリングうcodeforester's solutionは正常であるが、は約30項目始まります。
(項目が少ないほど、外部ユーティリティのソリューションは遅くなりますが、それはほとんど問題になりません)。

max_index() { 
    printf '%d\n' "$(shopt -s nullglob; 
        printf '%s\n' "$1_"* | 
        awk -F_ '{print $NF}' | 
         sort -rn | head -n 1)" 
} 

注:

ソリューションは、以下より簡潔であることの追加の利点を持っている合理的な仮定は、あなたのファイル名が何埋め込ま改行を持っていないと判断されます。

  • shopt -s nullglobグロブパターン(この場合は"$1_"*は)何にもマッチしなかった場合、それはNULL(空)文字列に展開することを保証します。

  • printf '%s\n' "$1_"*は、すべての一致するファイルシステム項目を1行ずつ表示します。

  • awk -F_ '{print $NF}'は、最後の_ベースのトークンを各行、つまり末尾の数字に出力します。

    • 注:cut -d_ -f2はあまりにも動作しますが、唯一 _がファイル名に存在していることを前提になるでしょう。逆(-r)で
  • sort -rnソート数値末尾の番号(-n)。

  • head -n 1は、最初の出力行のみを抽出します。これは、定義上、最も高い番号(存在する場合)です。

注既存_<number>サフィックスが見つからない場合は何が起こるか効果的であるprintf '%d\n' ''出力0、その。

関連する問題