【问题标题】:rename files with .jpg extension according to its folder name via bash script通过 bash 脚本根据文件夹名称重命名具有 .jpg 扩展名的文件
【发布时间】:2011-03-18 10:12:22
【问题描述】:

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

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

2,3,4 以此类推...

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

【问题讨论】:

  • 您确定 1/large 中没有其他文件吗?如果有,那么您将使用一个文件名重命名所有文件。最终,你只会得到 1 个文件,即 large_1.jpg
  • 是的,我在 1/large 文件夹中只有一个 jpg 或 jpeg 或 png 文件。

标签: linux bash shell


【解决方案1】:
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"

【讨论】:

    【解决方案2】:
    #!/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 等。

    【讨论】:

      【解决方案3】:

      基于原生 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
      

      【讨论】:

      • 这对于包含空格的文件名将失败。您应该使用while read 循环而不是for 循环。
      • 当然可以;但这不在问题描述中。从来没有说过这是一个通用的解决方案 :-) 但是是的,while read 会更好!
      【解决方案4】:

      你的意思是这样的吗?

      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 的评论)。

      【讨论】:

      • 不要使用for 循环来迭代输出文件名的程序的输出。使用while read 循环或xargs。带有空格的文件名会破坏for 循环。您还应该始终引用包含文件名的变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2018-12-23
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多