【发布时间】:2017-05-29 17:32:33
【问题描述】:
这就是问题所在。我在 Ubuntu 14.04 服务器上有一个包含超过 100,000K 文件的目录。我需要在后台处理文件,所以我编写了一个 shell 脚本,将文件转换为更大的文件,然后删除文件。然而,发挥作用的问题还在于进程脚本和输出文件。有什么想法吗?
#!/bin/sh
c=0
#loop through 1000 results at 1 time
d=1000
while [ $c -lt $d ]
do
filename=$(`ls | head -n 1`)
#echo $filename
if [ $filename == "process.sh" ]
then
break
fi
if [ $filename == "file.txt" ]
then
break
fi
cat `ls | head -n 1` >> file.txt
rm `ls | head -n 1`
#echo $c
c=`expr $c + 1`
done
【问题讨论】:
-
您可以在处理完成后删除违规行:
sed -i.bak '/pattern to match/d' ./file.txt -
问题是正在处理的文件数量不固定。总是有批量添加的文件。我的意思是有时有 100,000 个,有时更少。我想我可以先从循环中获得文件数,然后从循环中获得-1,因为其他文件都有数字名称。不确定,我想我需要刷一下我对 shell 脚本的了解。
-
除非我遗漏了什么,
ls | head -n 1将始终返回第一个文件。我没有看到这个脚本在文件中进行。也不应该是filename=$(ls |头 -n 1)是filename=$(ls | head -n 1)?在做简单的数学运算时,我更喜欢c=$((c+1))的格式。 -
不要在循环中调用
ls。如果您想处理前 1000 个文件(并且您想要解析ls),只需执行类似ls | sed 1000q | while read filename; do ...的操作 -
另外,将您的脚本和输出文件放在不同的目录中。