2016-12-01 7 views
0

私はたくさんのファイルがあるフォルダを持っています。 File、File.0、File.1、File.2bashスクリプトでファイルの拡張子の中で最大のインデックスを見つける

私はこのファイルの拡張子として最大でindexを探しています。だからそれは2でなければならない。numeric extensionですべてのファイルを数えるこのコマンドを書いたのは

です。 しかし、インデックスが10より大きい場合は正常に動作しません。インデックス内の数値とファイルの合計ではなく、最大のインデックスを検索したいからです。

$1 (is file name in this case File) 

y=$(echo $(ls -d $1.[0-inf] | wc -l)) 

どうすればいいですか?

+0

はどうなりますか? 'Files.1.0'、' Files.1.1'、 'Files.1.2'という名前のファイルを検索しますか? – Aserre

+0

はい。インデックスは最後のドットの後の値を意味します。 – davoid

答えて

2

最初のヒント:do not parse the output of ls。特にあなたの場合。あなたは、あなたの問題に対処するために、純粋なbashで次のスクリプトを使用することができ

:あなたの引数 `$ 1`は` File.1`とき

#!/bin/bash 

# needed for correct glob expansion 
shopt -s nullglob 

# we check every file following the format $1.extension 
max_index=0 
for f in $1.* 
do 
    # we retrieve the last extension 
    ext=${f##*.} 
    re="^[0-9]+$" 

    # if ext is a number and greater than our max, we store it 
    if [[ $ext =~ $re && $ext -gt $max_index ]] 
    then 
     max_index=$ext 
    fi 
done 
echo $max_index 
+0

これはどうでしょうか? 'y = $(echo $(ls -d $ 1。* [0-9] * sed '/ [^ 0-9] * // g')) max =for $ y; [$ v -gt $ max]の場合 を実行します。 max = $ v fi done' – davoid

+0

ファイルが存在しないときは、「ダウ」:「ls:何もアクセスできません」[0-9] * ':そのようなファイルまたはディレクトリはありません。これは、これらの場合に 'ls'を使用しない理由です。 – Aserre

+0

Ok。この情報に感謝。しかし、私はファイルが存在すると推定します。 – davoid

1

あなたはこれを試すことができます。

for i in file\.*; do echo ${i##*.}; done | sort -g | tail -n1 

${i##*.}は、ファイル名の最後の.前に、すべてのものを削除しています。

sort -gは数値としてソートされています。

tail -n1最後のインデックスを出力します。

よりエラーが発生しやすい方法は、それがパターンに一致しないファイルにも対応しますよう、スペースを含むファイル名をfindコマンドを使用することです...

find -type f -name "file\.*" -exec bash -c 'echo ${1/*\.}' _ "{}" \; 2>/dev/null | sort -n | tail -n1 

bash -c 'echo ${1/*\.}' _ "{}"は前に文字を削除するコマンドであります.

ディレクトリ内で再帰的に見ないように、コマンドの冒頭に-maxdepth 1を追加するとよいでしょう。

+0

名前付けパターンに続くファイルがない場合、スクリプトはカレントディレクトリのすべてのファイルのリストを返します – Aserre

関連する問題