2014-01-12 12 views
1

我在StackOverflow上找到了一個腳本,我對其進行了一些修改。 該腳本對子文件夾中的文件夾中的所有文件進行分類,每個子文件夾只有8個文件。但我有這樣的名字0541_2pcs.jpg文件。 2件意味着兩件(副本)。如何使一個bash腳本按特定數字對文件夾中的文件進行分類

所以我希望腳本在將文件分割到每個文件夾時將其作爲計數。例如一個文件夾可能有6個文件,而這個0541_2pcs.jpg字面意思是2個文件等等,這取決於文件名中指出的數字。

這是腳本:

cd photos; 
dir="${1-.}" 
x="${1-8}" 

let n=0 
let sub=0 
while IFS= read -r file ; do 
    if [ $(bc <<< "$n % $x") -eq 0 ] ; then 
      let sub+=1 
      mkdir -p "Page-$sub" 
      n=0 
    fi 

    mv "$file" "Page-$sub" 
    let n+=1 
done < <(find "$dir" -maxdepth 1 -type f) 

誰能幫助我?

+0

您的要求不是很清楚。你是否試圖說所有帶有前綴'0541_'的文件都應該移到它們自己的子目錄? – tripleee

+0

鏈接到您在SO上找到原始腳本的問題/答案。 –

回答

0

您可以通過代碼[ ${file/2pcs/x} != $file ]添加一個測試,以確定文件名是否包含字符串「2pcs」。在下面顯示的腳本中,如果該測試成功,則第二次增加n。請注意,如果測試第八個包含在一個目錄中的文件是一個多片文件,那麼最終會在該目錄中包含太多文件。這可以通過腳本不做的其他測試來處理。請注意,您的腳本沒有理由呼叫bc做模數,並且從第一個參數設置dirx都不起作用;我的腳本使用兩個參數。

#!/bin/bash 

# To test pagescript, create dirs four and five in a tmp dir. 
# In four, say 
# for i in {01..30}; do touch $i.jpg; done 
# for i in 03 04 05 11 16 17 18; do mv $i.jpg ${i}_2pcs.jpg; done 
# Then in the tmp dir, say 
#  rm -rf Page-*; cp four/* five/; ../pagescript five; ls -R 

#cd photos; # Leave commented out when testing script as above 
dir="${1-.}" # Optional first param is source directory 
x=${2-8}  # Optional 2nd param is files-per-result-dir 

let n=x 
let sub=0 
for file in $(find "$dir" -maxdepth 1 -type f) 
do # Uncomment next line to see values as script runs 
    #echo file is $file, n is $n, sub is $sub, dir is $dir, x is $x 
    if [ $n -ge $x ]; then 
     let sub+=1 
     mkdir -p Page-$sub 
     n=0 
    fi 
    mv "$file" Page-$sub 
    [ ${file/2pcs/x} != $file ] && let n+=1 
    let n+=1 
done 
相關問題