2014-10-31 110 views
1

我想重命名文件在一個巨大的圖像文件夾,其中包含大量的子文件夾,並在其中的圖像。遞歸重命名與子文件夾的圖像集合

事情是這樣的:

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 

但我的問題,依靠不能夠保留fil es在其相應的子文件夾中,而是將所有內容都移動到path/to/dir根文件夾。

+0

使用find命令,獲取所有文件的列表(找到您的主文件夾| grep「\ .jpg $」)會給你列表。使用for循環(計數器從0開始)並開始執行shenzi(mv $ {file} $(dirname $ {file})/ $ counter.jpg)。 for循環的最後一行將會((counter ++))。 there – 2014-10-31 16:50:45

回答

1

純巴什解決方案(除了從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)) 

這是100%安全有關的文件名(或dirnames中)含有空格或其他有趣的符號。

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. 目錄名命令會給你填充路徑(不包括文件名),對於給定的$ F文件的完整路徑。
  3. $ x.jpg會做的。 $ x值將在循環中每次迭代時遞增。
+0

如果你不想要「查找」命令遞歸到最深層次,請使用-maxdepth N,其中N是一個數字(例如-maxdepth 3查找* .jpg在當前,下來,僅下至第三級文件夾)。 – 2014-10-31 16:57:19

+0

工作得很好,謝謝。 – JohD 2014-10-31 19:40:14

+0

@JohD這可以工作......直到你用空格或其他有趣的符號創建了一個文件名。祝你好運。 – 2014-10-31 22:00:34