所以,我写了一些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
#######################################
答案 0 :(得分: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
答案 1 :(得分:1)
编写shell脚本时,通常最简单的方法就是使用现有的Linux实用程序。在这种情况下,例如,sed
可以为您完成大部分繁重的工作。这可能不是最强大的代码片段,但您明白了这一点:
for file in *.jpg; do
newFile=`echo $file | sed 's/\(.*\)_by_\(.*\)\(\..*\)/\2_\1\3/g'`
mv $file $newFile
done