2016-10-17 12 views
0

複数のファイルが約150あり、名前がベンダーの要件と一致しません。例えば、ファイル名は次のとおりです。UNIX(BASH)のファイル名の数字を置換する

company_red001.p12 
company_red002.p12 
. 
. 
. 
. 
company_red150.p12 

が、私は24の各番号の順に追加されるように、すべてのファイルの名前を変更する必要があり、そこにあることは、先行ゼロのとcompany_成分が除去されています。

red25.p12 
red26.p12 
red27.p12 
. 
. 
. 
red150.p12 

私はcompany_成分を除去するbashでのループを使用しているが、私は瞬間が気づくでこれを実行するために持っているように、同時にすべての変更を行い、何かをしたいと思います。

例:

#!/bin/bash 

n = 24 

for file in company_red* 

do 

    new_name=$file$n 
    n=$(($+1)) 
    mv -i $file $new_name 

done 

例2

#!/bin/bash 

for f in company_red* 

do mv "$f" "${f/company_red/red}"; 

done 
+0

「私はforループを使用しました」 - あなたの部品から少なくともいくつかの努力を示すために問題のコードサンプルを提供してください:) – sjsam

+1

私の謝罪は私の仕事用コンピュータで行われました。私は、私の努力を表現することはできません、上記のサンプルは動作しませんでした。 – mick

+0

ありがとう、問題は解決しました。 – mick

答えて

0

おそらくこの1つは:)

# printf is used to emulate a lot of files 
for f in $(printf "company_red%03d.p12\n" {1..150}) 
do 
    # get the filename 
    n="$f" 
    # remove extension 
    n="${n%.*}" 
    # remove leading letters 
    n="${n##*[[:alpha:]]}" 
    # add 24, 10# is used to consider the 10-based number 
    n="$((10#$n + 24))" 
    # construct new filename 
    g="red${n}.p12" 
    echo mv "$f" "$g" 
done 

細かいことができ、これはA簡素化することができビット

for f in $(printf "company_red%03d.p12\n" {1..150}) 
do 
    # take the number from the specific, fixed position 
    n="${f:11:3}" 
    # everything below is the same as in the previous example 
    n="$((10#$n + 24))" 
    g="red${n}.p12" 
    echo mv "$f" "$g" 
done 

そして最後に、これは二回、まだ簡単にすることができ - ちょうど$n$gを使用しての脱出:

for f in $(printf "company_red%03d.p12\n" {1..150}) 
do 
    echo mv "$f" "red$((10#${f:11:3} + 24)).p12" 
done 

しかし、これはコードの理解とサポートを複雑にする可能性があります。

0

の操作を行います。

for file in *.p12; do 
    name=${file#*_} ## Extracts the portion after `_` from filename, save as variable "name" 
    pre=${name%.*} ## Extracts the portion before extension, save as "pre" 
    num=${pre##*[[:alpha:]]} ## Extracts number from variable "pre" 
    pre=${pre%%[0-9]*} ## Extracts the alphabetic portion from variable "pre" 
    suf=${name##*.} ## Extracts the extension from variable "name" 
     echo mv -i "$file" "${pre}""$(printf '%d' $((10#$num+24)))"."${suf}" ## Doing arithmetic expansion for addition, and necessary formatting to get desired name 
done 

出力:

mv -i company_red001.p12 red25.p12 
mv -i company_red002.p12 red26.p12 

上記のあなたが行われるように名前変更に満足している場合はechoを削除し、ドライランです:

for file in *.p12; do 
    name=${file#*_} 
    pre=${name%.*} 
    num=${pre##*[[:alpha:]]} 
    pre=${pre%%[0-9]*} 
    suf=${name##*.} 
     mv -i "$file" "${pre}""$(printf '%d' $((10#$num+24)))"."${suf}" 
done 
関連する問題