我有幾個包含大量文件的目錄。由於其中一些正在接近60萬個文件,它們已經成爲一個主要的難題。列出文件正在慢慢成爲應用程序處理的主要瓶頸。根據文件名將文件分類到目錄中
文件的命名是這樣的: id_date1_date2.gz 我已經決定將文件分割成幾個較小的一個,根據第一部分,「ID」。
由於同一個ID可能出現在大量文件中,並且相同的ID已經出現在幾個目錄中,所以我需要跟蹤哪些文件ID已被複制,以及來自哪些目錄。 否則,我會最終做同樣的複製一個瘋狂的時間量,或從方向Y複製時丟失id X,如果已經從方向Z複製。
我寫了一個腳本來完成此操作。一些調試包括
#!/bin/bash
find /marketdata -maxdepth 2 -type d | grep "[0-9]\.[0-9][0-9][0-9]$" | sort | #head -n2 | tail -n1 |
while read baseDir; do
cd $baseDir;
echo $baseDir > tmpFile;
find . -type f | grep -v "\.\/\." | #sort | head -n4 |
while read file; do
name=$(awk 'BEGIN {print substr("'"$file"'", 3,index("'"$file"'", "_")-3)}');
dirkey=${baseDir//[\/,.]/_}"_"$name;
if [ "${copied[$dirkey]}" != "true" ]; then
echo "Copying $baseDir/$name with:";
echo mkdir -p $(sed 's/data/data4/' tmpFile)/$name;
#mkdir -p $(sed 's/data/data4/' tmpFile)/$name;
oldName=$baseDir/$name"_*";
echo cp $oldName "$(sed 's/data/data4/' tmpFile)/$name/";
#cp $oldName "$(sed 's/data/data4/' tmpFile)/$name/";
echo "Setting $dirkey to true";
copied[$dirkey]="true";
else
echo "$dirkey: ${copied[$dirkey]}"
sleep 1
fi
done;
rm tmpFile;
done
這裏的問題是,在複製的所有鍵的值,似乎從一開始複製成爲真正的,所以我的bash陣列的處理可能是這裏的問題。
一些進展: 我嘗試將每個鍵寫入文件,並且在每次迭代時,我都將該文件讀入數組中。這顯然非常難看,但看起來它實現了我的目標。可能是因爲我處理了幾千個ID,這變得非常慢。稍後更新。
別人誰可能在將來發現這一點,這裏的最終腳本:
declare -A copied
find /marketdata -maxdepth 2 -type d -name "[0-9]\.[0-9][0-9][0-9]" | sort | #head -n3 | tail -n1 |
while read baseDir; do
cd $baseDir;
find . -type f | grep -v "\.\/\." | sort | #head -n100 |
while read file; do
length=$(expr index "$file" "_");
name=${file:2:$((length - 3))};
dirkey=${baseDir//[\/,.]/_}"_"$name;
if [ "${copied[$dirkey]}" != "true" ]; then
echo "Copying ${baseDir}/${name} to ${baseDir//data/data4}/$name";
mkdir -p "${baseDir//data/data4}/$name";
oldName="${baseDir}/${name}_*";
cp -n $oldName "${baseDir//data/data4}/${name}/";
copied[$dirkey]="true";
fi
done;
done
沒有的awk,sed中沒有更好的報價,沒有文字的臨時文件到光盤,grep的少。 我不確定在關聯數組正常工作的情況下是否需要dirkey hack,也不完全明白爲什麼我需要oldName var。
你必須使用bash,或者是perl,python,......可以接受的選擇嗎? – 2010-10-05 15:01:46
我開始考慮使用php自己,因爲我熟悉這一點。只要腳本足夠可讀,我就可以知道它能做到我想要的,所以任何語言都可以。 – Claes 2010-10-05 15:04:28