通过bash脚本根据文件夹名称重命名带有.jpg扩展名的文件

时间:2011-03-18 10:12:23

标签: linux bash shell

我的文件夹及其子文件夹中有.jpg文件。

image/1/large/imagexyz.jpg 
image/1/medium/imageabc.jpg
image/1/small/imagedef.jpg

等2,3,4 ......

我需要使用文件夹名称重命名所有图像文件。 即。 imagexyz.jpg应该是large_1.jpg,imageabc.jpg应该是medium_1.jpg等等。

4 个答案:

答案 0 :(得分:3)

oldIFS="$IFS"
IFS=/
while read -r -d $'\0' pathname; do
  # expect pathname to look like "image/1/large/file.name.jpg"
  set -- $pathname
  mv "$pathname" "$(dirname "$pathname")/${3}_${2}.jpg"
done < <(find . -name \*.jpg -print0)
IFS="$oldIFS"

答案 1 :(得分:3)

#!/bin/sh
find . -type f -name "*.$1" > list
while read line
do
echo $line
first=`echo $line | awk -F/ '{print $2}'`
echo $first 
second=`echo $line | awk -F/ '{print $3}'`
echo $second
name=`echo $line | awk -F/ '{print $4}'`
echo $name

mv "./$first/$second/$name" ./$first/$second/${first}_${second}.$1

done < list

如果您将此文件另存为rename.sh,则运行rename.sh jpg以替换jpg文件,并运行rename.sh png以替换png,依此类推。

答案 2 :(得分:2)

基于本机bash函数的解决方案(好吧,除了find,然后;-))

#!/bin/bash

files=`find . -type f -name *.jpg`
for f in $files
do
     echo
     echo $f
     # convert f to an array
     IFS='/'
     a=($f)
     unset IFS
     # now, the folder containing a digit
     # are @ index [2]
     # small, medium, large are @ [3]
     # and name of file @ [4]

     echo ${a[2]} ${a[3]} ${a[4]}
     echo ${a[3]}_${a[2]}.jpg
done

答案 3 :(得分:1)

你的意思是什么?

for i in $(find image/ -type f); do 
  mv $i $(echo $i | sed -r 's#image/([0-9]+)/([^/]+)/[^/]+.jpg#\2_\1.jpg#'); 
done

这会将所有文件从image/$number/$size/$file.jpg移至./${size}_${number}.jpg

但请注意,如果每个image/$number/$size目录中有多个.jpg文件,您将覆盖您的文件(请参阅kurumi的评论)。