1

そこで、逸脱アートからダウンロードした画像ファイルの名前を変更するための BASH シェル スクリプトをいくつか作成し、アーティスト名が最初に来て、次にアート作品の名前が来るようにしました。(dA に慣れていない方のために説明すると、システムはダウンロード可能な画像ファイルに imageTitle_by_ArtistsName.extention という名前を付けるため、画像をすばやく整理するのが難しくなります)。それは機能します...しかし、それはとてもぎこちないようです。これを処理するよりエレガントな方法はありますか?

コード:

#!/bin/bash
#############################
# A short script for renaming
#Deviant Art files
#############################

echo "Please enter your image directory: "
read NewDir

echo "Please enter your destination directory: "
read DestinationDir

mkdir $DestinationDir
cd $NewDir


ls>>NamePile

ListOfFiles=`cat NamePile`


for x in $ListOfFiles
do


#Pull in the file Names
FileNameVar=$x


#Get the file types
FileType='.'${FileNameVar#*.}

#Chop the Artists name
ArtistsName=${FileNameVar%%.*}
ArtistsName=${ArtistsName##*_by_}

#Chop the pieces name
ImageName=${FileNameVar%%.*}
ImageName=${ImageName%%_by_*}

#Reassemble the New Name
NewFileName=$ArtistsName" "$ImageName$FileType

cp $x ../$DestinationDir/"$NewFileName"


done

rm NamePile
#######################################
4

2 に答える 2

3

正規表現マッチングを使用すると、ループを大幅に単純化できます。

for file in *; do  # Don't parse the output of ls; use pattern matching
  [[ $file =~ (.*)_by_(.*)\.(.*) ]] || continue

  imageName="${BASH_REMATCH[1]}"
  artistsName="${BASH_REMATCH[2]}"
  fileType="${BASH_REMATCH[3]}"

  cp "$file" "../$DestinationDir/$artistsName $imageName.$fileType"
done
于 2012-10-12T23:55:20.480 に答える
1

シェルスクリプトを作成する場合、通常、既存のLinuxユーティリティを使用するのが最も簡単です。この場合、たとえば、sed手間のかかる作業のほとんどを行うことができます。これはおそらく最も堅牢なコードスニペットではありませんが、次のようなアイデアが得られます。

for file in *.jpg; do
    newFile=`echo $file | sed 's/\(.*\)_by_\(.*\)\(\..*\)/\2_\1\3/g'`
    mv $file $newFile
done
于 2012-10-12T23:59:59.897 に答える