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



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

相关内容

  • 没有找到相关文章

最新更新