所以,我写了一些BASH shell脚本,用于重命名从离经叛道的艺术下载的图像文件,所以艺术家的名字排在第一位,然后是艺术品的名称。(对于那些不熟悉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
#######################################
通过使用正则表达式匹配,可以大大简化循环。
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
在编写 shell 脚本时,通常最简单的方法是简单地利用现有的 Linux 实用程序。 例如,在这种情况下,sed
可以为您完成大部分繁重的工作。 这可能不是最健壮的代码片段,但你明白了:
for file in *.jpg; do
newFile=`echo $file | sed 's/(.*)_by_(.*)(..*)/2_13/g'`
mv $file $newFile
done