天天看點

每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

  • ​​圖檔命名預處理​​
  • ​​建立檔案夾用來存放按需處理後的檔案​​
  • ​​移動對應的檔案到temp檔案夾​​
  • ​​Windows使用者操作方法​​

應邀做資料預處理,需求是這樣的。

每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

一共20個有效檔案夾,每個檔案夾中是這樣的

每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

需求是:​

​每個檔案夾中的第一個圖檔放在一起,第二個圖檔放在一起,以此類推。現在是20個檔案夾,每個檔案夾有56張圖檔,處理後的結果是一共有56個檔案夾,每個檔案夾中有20張圖檔​

​。

圖檔命名預處理

因為原始圖檔的命名并不利于按順序查找檔案,我們将其重命名。

這裡我們要考慮一下重命名的方式:

  1. 首先,為了後期檢查或者查找友善,我們把原始的檔案夾名帶上,這樣彙總後的檔案知道是從哪個檔案夾來的;
  2. 檔案名中還要有檔案的索引序号;
  3. 原始的檔案名不要動,為了後期檢查;

是以,根據這幾個規則,我們重命名後的檔案名将是:

每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

這種形式。

第一組數字代表檔案來自哪個檔案夾,如第一張圖所示;第二個數字代表檔案的索引号,如第二張圖所示,後面的是原始檔案名。

建立名為rename.sh的檔案。

cd 720  #720為檔案主目錄
vi      

關于vi和其他一些說明請參考對檔案預處理的上一篇文章,​​從大量檔案中找到指定檔案并執行指定檔案操作​​,這裡面介紹了更多的細節,因為已經介紹過,這篇将不再介紹基礎的細節,而隻專注于代碼實作。

在rename.sh中,輸入以下代碼

#!/bin/bash

for folder in *    # 周遊所有檔案夾
do
  cd $folder
  
  INDEX=1      # 用來确定檔案的索引序号
  for f in *       # 周遊所有檔案
  do 
    cp -- "$f" "$folder-$INDEX-$f"    # -- 必須要有,為什麼要複制而不是直接對源檔案重命名呢,因為保留源檔案是個不錯的習慣
    ((INDEX++))    # 對于數學的運算,有很多方法,(())嵌套括号是其中之一
  done

  cd ..  # 跳進了子檔案夾,不要忘記跳出去
done      

這就是對所有檔案重命名的代碼。

建立檔案夾用來存放按需處理後的檔案

處理後是56個檔案夾,每個檔案夾20個檔案。是以直接建立一個大檔案夾和56個子檔案夾。子檔案夾的命名就以數字序号來表示。

這句指令較為簡短,便不以腳本程式的方式來執行,直接在終端中輸入敲回車即可。

for((i=1; i<=56; i=i+1)); do mkdir -p ./temp/$i; done      
每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

建立後的目錄結構如圖。

移動對應的檔案到temp檔案夾

我們要将每個檔案夾中序号為1的圖檔移動到/temp/1檔案夾,以此類推。

建立file.sh。

#!/bin/bash

for ((i=1; i<=56; i=i+1))
do
  f="*-$i-*.bmp"  # 隻需要對i進行比對,其他的都通配就可以
  find -iname $f -type f -exec mv {} ./temp/$i \;
  # 這裡為什麼要用mv直接移動而不是複制呢,直接移動有助于檢查是否還有漏下的檔案沒有
  # 被移動過去,便于debug
done      

完成後,temp檔案夾的目錄結構就是這樣的

每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾

Windows使用者操作方法

繼續閱讀