有没有更好的方法在BASH中交换文件名的前半部分和后半部分?

时间:2012-10-12 23:14:06

标签: bash shell

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

2 个答案:

答案 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