使用子文件夹递归重命名图像集合

时间:2014-10-31 16:17:34

标签: image bash shell recursion renaming

我试图在一个巨大的图像文件夹中重命名文件,其中包含许多子文件夹,其中包含图像。

这样的事情:

ImageCollection/
    January/
      Movies/
        123123.jpg
        asd.jpg
      Landscapes/
        qweqas.jpg
    February/
      Movies/
        ABC.jpg
        QWY.jpg
     Landscapes/
        t.jpg

我想运行脚本并按升序重命名,但将它们保存在相应的文件夹中,如下所示:

ImageCollection/
    January/
      Movies/
        0.jpg
        1.jpg
      Landscapes/
        2.jpg
    February/
      Movies/
        3.jpg
        4.jpg
     Landscapes/
        5.jpg

到目前为止,我有以下内容:

#!/usr/bin/env bash
x=0
for i path/to/dir/*/*.jpg; do
    new=$(printf path/to/dir/%d ${x})
    mv ${i} ${new}
let x=x+1
done

但是我的问题依赖于无法将文件保存在相应的子文件夹中,而是将所有内容移动到path/to/dir根文件夹。

2 个答案:

答案 0 :(得分:1)

纯粹的Bash解决方案(当然除了mv之外):

#!/bin/bash

shopt -s nullglob

### Optional: if you also want the .JPG (uppercase) files
# shopt -s nocaseglob

i=1
for file in ImageCollection/*/*.jpg; do
    dirname=${file%/*}
    newfile=$dirname/$i.jpg
    echo mv "$file" "$newfile" && ((++i))
done

这不会执行重命名,只显示将要发生的事情。如果您对所看到的结果感到满意,请移除echo

您也可以-n使用mv选项,以免覆盖现有文件。 (我肯定会在这种情况下使用它!)。如果-n不可用,您可以使用:

[[ ! -e $newfile ]] && mv "$file" "$newfile" && ((++i))

对于包含空格或其他有趣符号的文件名(或dirnames),这是100%安全的。

答案 1 :(得分:0)

#!/bin/bash

x=0
for f in `find path_to_main_dir_or_top_folder | grep "\.jpg$"`;
do
   mv $f $(dirname $f)/$x.jpg && ((x++))
done
echo shenzi
  1. $ f将保存所有* .jpg文件的完整路径的所有文件
  2. dirname 命令将为您提供给定$ f文件的填充路径(不包括文件名)。
  3. $ x.jpg会做到这一点。 $ x值将在循环中每次迭代增加。