2017-01-15 4 views
0

フォルダに複数のファイルがあり、そのファイル名には英数字の値が含まれています。例えば、 045_gfds.sql、46kkkk.sql、47asdf.sqlなどです。これらのファイル名の数値を変数に格納された別の数値と比較したいのですが、$ x = 45と言います。私はCygwinを使用しており、現在はegrepコマンドを使用して数値を取り出すことしかできません。例えば、数値をBASHのファイル名と比較する方法

filename="C:\scripts" 
dir $filename | egrep -o [0-9]+ 

出力は次のとおりです。

46kkkk.sql 
47asdf.sql 

が大きい比較するための正規表現とが必要です:045 46 47

は私のようにすべてのファイル名でより大きい$ = 45を比較した後、ファイル名として出力したいですfilenameの値よりも

+1

これは、[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)の質問のようです。しかしおそらくそうではありません。 **あなたが達成しようとしている方法**ではなく**達成したいことを**説明することをお勧めします。おそらくもっと良い解決策があります。ここをクリックしてください:[The XY Question](http://xyproblem.info/) – giusti

+0

ありがとうgiusti、私は$ x = 45より大きいファイル名の番号を含むファイル名として出力します。私の質問を明確にするためにもっと情報が必要な場合はお知らせください –

答えて

0
#!/bin/bash 

dir="$1" 

print_if_greater="45" 

for fname in "$dir"/[0-9]*; do 
    num="${fname##*/}"  # isolate filename from path 
    num="${num%%[^0-9]*}" # extract leading digits from filename 

    if ((num > print_if_greater)); then 
     printf '%s\n' "$fname" 
    fi 
done 

上記のスクリプトは、指定されたディレクトリ内の少なくとも1桁で始まるすべてのファイルを通過します。

ファイル名がパスから削除され、ファイル名の最初の数字が変数拡張構文bashを使用して抽出されます。

抽出された番号が$print_if_greaterより大きい場合、フルパス名が標準出力に表示されます。

このスクリプトは、検討したいディレクトリを指定して呼び出される:

$ ./thescript.sh 'C:\scripts' 

または

$ bash ./thescript.sh 'C:\scripts' 

私はCygwinのへのアクセスを持っていないので、私はできませんでしたウィンドウスタイルのパスでテストします。上記がうまくいかない場合は、C:/scriptsをパスとして試してください。

+0

ありがとうKusalananda !!!その仕事は絶対にうまい。私が今直面している問題は、ファイル名を考慮しないことだけです。その数字の後ろの数字(ドット)。例えば、比較の結果、'69 .hghgg.sql 'のようなファイル名は結果に表示されません。 –

+0

@JayeshSangleうん...それは私のためです。 Cygwinをインストールしてテストしました。ファイルにはファイル名の先頭にスペースがありますか? – Kusalananda

0

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

DIR="C:\scripts" 
MAX=45 
for FILE in "$DIR"/* 
do 
    if 
    [[ "$FILE" =~ ^([0-9]+) ]] 
    then 
    NUMBER="${BASH_REMATCH[1]}" 
    if 
     [ "$NUMBER" -gt "$MAX" ] 
    then 
     echo "$FILE" 
    fi 
    fi 
done 

私はこのコードをテストしていませんのでご注意ください。これはbash固有であり、数字は常にファイル名の先頭にあるものとします。

関連する問題