2011-01-29 26 views
3

我有包含大量文件(例如1000+)的各種大小的文件夾,我想將它們移動到每個文件夾100個文件的較小組中。將大量文件分發到較小組的腳本

我寫了一個計算文件的Apple腳本,創建了一個編號的子文件夾,然後將100個文件移動到新文件夾中(可以指定文件的數量),這個文件夾循環到少於指定數量的文件它移動到它創建的最後一個文件夾。

問題是它的運行速度非常慢。我正在尋找可以在我的MacBook和/或Linux機器上運行的Apple腳本或shell腳本,這可以將文件有效地移動到較小的組中。

如何分組文件並不特別重要,我只想在每個文件夾中的文件較少。

+0

如果你顯示你的代碼,我們可以改進它。 – 2011-01-29 21:50:25

+0

@丹尼斯:這有點令人尷尬。當我的筆記本電腦驅動器死亡時,我失去了腳本,現在,在考慮重寫腳本時,我想我會先從SO社區尋求幫助。 – Tony 2011-01-29 23:01:41

回答

2

這應該讓你開始:

DIR=$1 
BATCH_SIZE=$2 
SUBFOLDER_NAME=$3 
COUNTER=1 

while [ `find $DIR -maxdepth 1 -type f| wc -l` -gt $BATCH_SIZE ] ; do 
    NEW_DIR=$DIR/${SUBFOLDER_NAME}${COUNTER} 
    mkdir $NEW_DIR 
    find $DIR -maxdepth 1 -type f | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR 
    let COUNTER++ 
if [ `find $DIR -maxdepth 1 -type f| wc -l` -le $BATCH_SIZE ] ; then 
    mkdir $NEW_DIR 
    find $DIR -maxdepth 1 -type f | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR 
fi 
done 

if語句獲取最後剩餘的文件的嵌套。您可以根據需要添加一些額外的檢查,以便在修改後使用。

1

解決文件中文件太多的目錄問題的最常見方法是用名稱的前幾個字符進行細分。例如:

前:

aardvark 
apple 
architect 
... 
zebra 
zork 

後:

a/aardvark 
a/apple 
a/architect 
b/... 
... 
z/zebra 
z/zork 

如果沒有細分不夠好,然後走一步:

a/aa/aardvark 
a/ap/apple 
a/ar/architect 
... 
z/ze/zebra 
z/zo/zork 

這應該工作很快,因爲腳本執行的移動命令可以使用簡單的glob擴展來選擇所有文件移動,ala mv aa* a/aa,而不是必須在每個文件上單獨運行移動命令(這將是我第一次猜測爲什麼原始腳本很慢)

+0

謝謝,這是一個有用的提示。我將不得不對腳本解決方案進行編寫並查看它的執行情況。 – Tony 2011-01-29 21:40:27

3

這是一個巨大的kludge,但它不應該太可怕了:

rm /tmp/counter* 
touch /tmp/counter1 
find /source/dir -type f -print0 | 
    xargs -0 -n 100 \ 
     sh -c 'n=$(echo /tmp/counter*); \ 
       n=${n#/tmp/counter}; \ 
       counter="/tmp/counter$n"; \ 
       mv "$counter" "/tmp/counter$((n+1))"; \ 
       mkdir "/dest/dir/$n"; \ 
       mv "[email protected]" "/dest/dir/$n"' _ 

這是完全不分青紅皁白的,哪些文件去哪裏。

+0

我沒有機會在我的Linux機器上嘗試這個,但是當我將它運行在我的MacBook上時,出現以下錯誤:_:line 3:/ tmp/counter1:語法錯誤:期望的操作數(錯誤標記爲「/ tmp/counter1「)我會盡力去解決它,但是你有什麼想法可能會出錯嗎? – Tony 2011-01-30 19:57:52

相關問題