2012-10-11 7 views
5

このタイトルはちょっと混乱しています。基本的に私は、さまざまな名前と拡張子を持つファイルの完全なディレクトリを持っている:iPadアプリのために拡張の前に余分な接尾辞が付いたファイルのコピーを作成するにはどうすればBashを使用しますか?

MainDirectory/ 
    image_1.png 
    foobar.jpeg 
    myFile.txt 

、私はこれらのファイル名のすべての最後に追加2X @サフィックスでこれらのコピーを作成する必要があります、拡張子の前に - 私はこれで終わるだろう:

MainDirectory/ 
    image_1.png 
    [email protected] 
    foobar.jpeg 
    [email protected] 
    myFile.txt 
    [email protected] 

代わりの手によって一度にファイル名を変更する1、私は私のためにそれの世話をするためのスクリプトを作成したいです。私は現在、以下のものを持っていますが、期待どおりに動作しません:

#!/bin/bash 

FILE_DIR=. 

#if there is an argument, use that as the files directory. Otherwise, use . 
if [ $# -eq 1 ] 
then 
    $FILE_DIR=$1 
fi 

for f in $FILE_DIR/* 
do 
    echo "Processing $f" 
    filename=$(basename "$fullfile") 
    extension="${filename##*.}" 
    filename="${filename%.*}" 
    newFileName=$(echo -n $filename; echo -n [email protected]; echo -n $extension) 
    echo Creating $newFileName 
    cp $f newFileName 
done 

exit 0 

は私も純粋のbashにこれを維持し、OS固有の呼び出しに依存しないようにしたいです。私は間違って何をしていますか?私が必要とすることをするために、私は何を変えることができますか、どのコードがうまくいくのでしょうか?

答えて

6
#!/bin/sh -e 
cd "${1-.}" 

for f in *; do 
    cp "$f" "${f%.*}@2x.${f##*.}" 
done 
+0

チャームのように働いた!ありがとう – Phil

+1

は#、##、%、%%について知らなかった - とても役に立ちました、ありがとう!詳細はこちらhttp://tldp.org/LDP/abs/html/string-manipulation.html – ahmedre

1

それはこのように1行でawkでそれを行うことは非常に簡単です:あなたは、パイプawkドットを使用するように、ls -1

ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' | sh 

、ファイルのちょうど裸のリストを取得(。)セパレータとして。次に、シェルコマンドを作成して、各ファイルのコピーを作成します。

cpのコマンドが正しいことを確認するには、最後にshパイプを使用せずにコマンドを実行することをお勧めします。このように:

ls -1 | awk -F "." ' { print "cp " $0 " " $1 "@2X." $2 }' 
関連する問題