我有几个包含大量文件的目录。由于其中一些正在接近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