1

所以,我写了一个 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
#######################################
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

编写 shell 脚本时,最简单的方法通常是简单地利用现有的 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 回答