2012-05-11 12 views
1

この質問は尋ねられましたが、複数の解決策を見つけることができず、私のためには機能しません。番号付きで既存のシーケンスからファイルの新しいシーケンスを作成します

image1.jpg
image2.jpg
image3.jpgは

そして、各1のコピーを作成:基本的に、私はこのようなファイルのリストを取りますbashスクリプトを探しています順番に逆方向に番号を付けます。だから、シーケンスが作成した3つの新しいファイルは、されているだろう:

image4.jpg
image5.jpg
image6.jpg

そして、まだ、image4.jpgは画像3のそのままコピーされていると思います。 jpg、image5.jpgはimage2.jpgのコピーです。私はすでにthis stackoverflow questionで概説されている解決策を運のない状態で試しました。私は、bashスクリプトのパスをあまり遠く離れているとは思っていません。そして、最初にリストされた答えでコードの塊をとり、スクリプトを作成すると、私はいつも "2:Syntax error:"( "unexpected"私は何か間違ったことをしているか、より良いスクリプトがあります。

私はこのコードを以前に投稿していませんが、私が使用しているコードは残念です。

image=(image*.jpg) 
MAX=${#image[*]} 
for i in ${image[*]} 
do 
    num=${i:5:3} # grab the digits 
    compliment=$(printf '%03d' $(echo $MAX-$num | bc)) 
    ln $i copy_of_image$compliment.jpg 
done 

そして、私はこのコードを取って、ナノでファイルに貼り付けると、最初の行として#/ binに/ bashのを追加し、その後、chmod +x scriptsh script経由でbashで実行していますもちろん、:です!。私のテストでは、ファイルを適切に使用しています。 itled image1.jpg - しかし、私はまた、このスクリプトをjpegのディレクトリに適用する方法について疑問を抱いていました。必ずしもタイトルが付いていない画像(整数).jpg - 私のファイル保存構造では、これらのほとんどは単一の単語で、 number、then .jpgのように、スクリプトを書き換える必要はありません。

+0

コードを投稿しないと、構文エラーが発生します。してください。 – tripleee

+0

ありがとうございましたfirの更新配列の構文は基本的なものです。ファイルの先頭に '#!/ bin/bash'があることを確認してください。そうしないと、' sh'(あるいは 'csh')プラットフォーム)。 – tripleee

+0

近くに読むと、エラーは 'shスクリプト'です。代わりに 'bash script'(または単に'。/ script')を使います。 – tripleee

答えて

0

おそらくこのようなものです。script image*.jpgのようなワイルドカードでは、通常のパターンと同じ長さの単調増加する数字と一致するファイルのセットと一致し、現在のディレクトリのファイルのより少ない正規のサブセットでは理想的ではありません。最後のファイルの数字インデックスとファイル名の合計数の合計が、ループオーバーする数字の範囲であると仮定します。

#!/bin/sh 

# Extract number from final file name 
eval lastidx=\$$# 
tmp=${lastidx#*[!0-9][0-9]} 
lastidx=${lastidx#${lastidx%[0-9]$tmp}} 
tmp=${lastidx%[0-9][!0-9]*} 
lastidx=${lastidx%${lastidx#$tmp[0-9]}} 

num=$(expr $lastidx + $#) 
width=${#lastidx} 

for f; do 
    pref=${f%%[0-9]*} 
    suff=${f##*[0-9]} 
    # Maybe show a warning if pref, suff, or width changed since the previous file 
    printf "cp '$f' '$pref%0${width}i$suff'\\n" $num 
    num=$(expr $num - 1) 
done | 
sh 

これはshと互換性があります。 exprのものと部分文字列の抽出は前面が見苦しいですが、Bourne互換です。組み込みのBashの算術演算と文字列操作のコンストラクターがうまくいけば、そのフォームに変換するのは簡単なはずです。

は(明示的であるためには、 ${var%foo} foo$varの値が終わりをオフにトリミング返し、 ${var#foo}は、値の先頭から同様のトリミングを行います。通常のシェルのワイルドカードのマッチング事業者がトリミングするために何のための式で使用できます。 ${#var} $varの値の長さを返します。

+0

これは完全に機能します。私はこの時間を、@ userunknownが述べたように、私は確かに非常に熟練したコーダーではないが、初心者の初心者であると認めて欲しい。私が何らかの方法で彼を怒らせたら、私は謝罪したいと思います。私はちょうどこれから始めて、誰かが助けてくれることを非常に感謝しています。ありがとうございました。 – user1388721

0
  • たぶん、あなたの本当のテストデータが001から300に実行されますが、ここでは、画像1 2 3を持っているので、あなたがいない3桁のファイル名から、1を抽出します。 NUM = $ {I:5:1}

  • 整数算術

  • $ {#画像[@]} BCを呼び出さずにbashで行うことができるが$よりも堅牢である{#画像[*]}ここで違いはありません。
  • 私は辞書に相談しませんでしたが、あなたの女の子の友人のための何かを称賛するものではありませんか?反対は補完ですね。 :)
  • 他のコマンドはリンクを作成しました - コピーを作成するには、cpを呼び出します。

コード:

#!/bin/bash 
image=(image*.jpg) 
MAX=${#image[@]} 
for i in ${image[@]} 
do 
    num=${i:5:1} 
    complement=$((2*$MAX-$num+1)) 
    cp $i image$complement.jpg 
done 

最も重要なこと:それはbashのであれば、bashのでそれを呼び出します。ベスト:シバンを(あなたがしたように)行い、それを実行可能にして./nameによって呼び出す。 shという名前で呼び出すと、間違った通訳が強制されます。実行可能にしない場合は、bash名としてください。

+0

コマンドラインで処理するファイルを指定する引数を受け入れないのはなぜですか?おそらく 'image =($ 1 * $ {2-.jpg})' – tripleee

+0

@トリプルリーのようなものです。ユーザーは外国のソースからスクリプトをコピーしたので、問題を自分で解決することはできませんでした。彼は計画を提示しました、それを解決する方法は?彼は進歩するには問題があったステップ?スクリプトは失敗しました。ファイル名がbla1.jpgではなくbla001.jpgのページから取り込んだためです。それは画像をリンクしましたが、コピーしませんでした。彼はこれらの誤りに何か気づいたという印象を持っていますか?それはコーダーなのでしょうか?またはこれは「私の無償のコーダーになる」要求ですか? –

関連する問題