每個檔案夾中按順序取出一個檔案,并按順序存入新的檔案夾
- 圖檔命名預處理
- 建立檔案夾用來存放按需處理後的檔案
- 移動對應的檔案到temp檔案夾
- Windows使用者操作方法
應邀做資料預處理,需求是這樣的。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SO4cjM2IzM2EDZ1cDOjdjMzYzX1ADM0kDM5EzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
一共20個有效檔案夾,每個檔案夾中是這樣的
需求是:
每個檔案夾中的第一個圖檔放在一起,第二個圖檔放在一起,以此類推。現在是20個檔案夾,每個檔案夾有56張圖檔,處理後的結果是一共有56個檔案夾,每個檔案夾中有20張圖檔
。
圖檔命名預處理
因為原始圖檔的命名并不利于按順序查找檔案,我們将其重命名。
這裡我們要考慮一下重命名的方式:
- 首先,為了後期檢查或者查找友善,我們把原始的檔案夾名帶上,這樣彙總後的檔案知道是從哪個檔案夾來的;
- 檔案名中還要有檔案的索引序号;
- 原始的檔案名不要動,為了後期檢查;
是以,根據這幾個規則,我們重命名後的檔案名将是:
這種形式。
第一組數字代表檔案來自哪個檔案夾,如第一張圖所示;第二個數字代表檔案的索引号,如第二張圖所示,後面的是原始檔案名。
建立名為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檔案夾的目錄結構就是這樣的