2011-08-11 3 views
0

を提供します。代わりに、単純なincrimental数値rename関数のバッシュ/バッチ複数ファイル、単一フォルダ、不正な名前変更スクリプト。ユーザーは、私が名前を変更する必要があるファイルのフォルダを持っているファイル名の接頭辞パラメータ

は、私が最初にそのフォルダ内のファイル名の整合性を確保するためにincrimentう命名規則を提供する必要があります。

は、私はファイルを持っていると言う:

に名前を変更する必要が
wei12346.txt 
wifr5678.txt 
dkgj5678.txt 

Eac-345-018.txt 
Eac-345-019.txt 
Eac-345-020.txt 

私が命名は異なる可能性があるスクリプトとそれに沿って行くために、数値incrimentを実行するたびに

Ebc-345-010.pdf 
Ebc-345-011.pdf 
Ebc-345-012.pdf 

私はユーザーから提供されたパラメータを尋ねる必要がありますこれは索引付けされるファイルのリストの中の前のファイル名として有用かもしれないと考えていました。例えば:Eac-345-017.txt

もう一つのことは、スクリプトがどのように099から100または999から1000のように私はこのプロセスがどのように実行されているか分からない。

私は、しかし、私は仕事でWindowsマシン上でCygwinを実行すると、スクリプトを実行するために、唯一のbashや窓のシェルへのアクセスを持っていますこれはperlで簡単にスクリプトであることを告げてきました。

行く私を取得するための任意のポインタをいただければ幸いです、私はいくつかの経験のプログラミングを持っていますが、スクリプトはほぼ完全に新しいです。

おかげで、 クレイグ

(私は理解してあり、すでに事のこのタイプのポストのアロットですが、どれも任意の簡潔な答えは、それゆえ私の質問を提供するように見えるん)

答えて

0
#!/bin/bash 

prefix="$1" 
shift 

base_n="$1" 
shift 

step="$1" 
shift 

n=$base_n 

for file in "[email protected]" ; do 
    formatted_n=$(printf "%03d" $n) 
    # re-use original file extension whilke we're at it. 
    mv "$file" "${prefix}-${formatted_n}.${file##*.}" 
    let n=n+$step 
done 

このようにそれを呼び出す、ファイルを保存:

bash fancy_rename.sh Ebc-345- 10 1 /path/to/files/* 

注意:あなたは、「名前を変更」.txt.pdfに、私は推定上の拡張子が同じとどまるあなたの例では。あなたが本当に拡張を変更したいのであれば、それは簡単な変更になります。実際にファイル形式を変換したければ、もう少し複雑になります。

また、私は%03dでインクリメントする数値をフォーマットしました。つまり、番号の順序は、たとえば

010 
011 
012 
... 
099 
100 
101 
... 
999 
1000 

3桁にゼロ詰めされますが、数字が大きくなると自動的にオーバーフローすることを意味します。一貫性(常に4桁)を希望する場合は、パディングを%04dに変更する必要があります。

+0

同じ種類のエラーが上に表示されているので、cygwinに問題があると思います。私は自分のhome * nixボックスでスクリプトを実行し、それをどのように扱うかを見てみよう。私は拡張子を変更しようとしているわけではありません。プレフィックスを変更する必要があります。たとえば、最初の接頭辞、例えばEV1-10を与え、次に前のファイルのaffrimentの値を返します。0014に0015になります。私は潜在的に何千ものファイルを処理するので、私は懸念していた問題を解決するのに便利です。私はスクリプト変数などに精通していない私は言ったようにJavaは私の慣れ親しんだ言語です。おかげで –

+0

@Craig:Windowsのメモ帳からスクリプトを作成していますか?メモ帳、そしてほとんどのWindowsネイティブテキストエディタは、DOS形式の行末でテキストファイルを保存します。 BashにはUnixスタイルの行末が必要です。ファイルを変換するか、それを行う方法を理解しているエディタで再保存してください。簡単な変換スクリプト: 'tr -d '\ r' tmp_file; mv file _file your_script_file'にコピーします。私はnotepad2またはbraindeadでない別の無料のメモ帳workalikeをダウンロードすることをお勧めします。注意:shとbashは同じものではありません! – Sorpigal

+0

私はnotepad ++を使用して作成しています。 –

0

OKは、次の操作を行うことができます。ユーザーは最初に接頭辞を付けてから開始シーケンス番号を尋ねることができます。その後、あなたは内蔵のprintfbashから数字上の正しい書式設定を行うために使用することができますが、これは、より均質な名前になりますので、すべてのシーケンスを保持するのに十分な数の幅を提供することを決定する必要があります。

echo -n "Insert the prefix: " 
read prefix 
echo -n "Insert the sequence number: " 
read sn 

for i in * ; do 
    fp=`printf %04d $sn` 
    mv "$i" "$prefix-$fp.txt" 
    sn=`expr $sn + 1` 
done 

注:あなたは、ユーザーの入力を読み取るためにreadを使用することができますまた、拡張子を抽出することができます。それは問題ではないでしょう。また、ここで私は、変数$fpに計算され、シーケンス番号FOT 4つの数字を選択しました。

+0

http://imageshack.us/photo/my-images/854/bashscreen.png/私のスクリプトは、実行時にエラーが表示されます。これはcygwinのためか、標準エラーですか? –

+0

あなたのコードも表示できますか?これらは非常に奇妙なエラーです。おそらく、文字エンコーディング(DOS/UNIX)と関係があります。 –

+0

このコードは面倒です。 #/ binに/ bashの プレフィックスは= "$ 1" シフト base_n = "$ 1" シフト ステップ= "$ 1" シフト N = $」内のファイルのための$ base_n :!私はappologiseを行います@ "; do formatted_n = $(printf "%03d" $ n) #元のファイル拡張子を再利用してください。 mv "$ file" "$ {接頭辞} - $ {書式付き_} $ {ファイル## *。}" let n = n + $ステップ done –

関連する問題