这是问题所在。我在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
答案 0 :(得分:0)
我会改写剧本。
#!/bin/bash
c=0
d=1000
for file in $(find . -maxdepth 1 -type f \( ! -name process.sh -a ! -name file.txt \))
do
cat $file >> file.txt
rm $file
c=$((c+1))
if [ $c -eq $d ]; then
break
fi
done
答案 1 :(得分:0)
您应该在每个循环中只调用ls | head -n 1
一次。检查后再次调用ls | head -n 1
,结果可能不同(并发process.sh仍在运行或新文件)。
您想如何在file.txt
之后列出文件?你正在打破循环,其他文件将被跳过。请勿继续更改,因为您会继续将file.txt
分配给filename
始终对你的vars使用双引号(考虑my file.txt
),你可能也想习惯括号。
假设您的批处理工作正常,并且已经处理了最后一个非特殊文件。 "${filename}"
将是空的!所以从测试if [ -f "${filename}" ]
开始,这也将解决目录的问题。
我真的希望你有权删除这些文件,这样你就不会卡住处理同一个文件1000次。
你不应该处理ls
输出,所以替代
ls | egrep -v "file.txt|process.sh" | head -n 1
只是做错的另一种方式。
当您收到"${filename}"
并希望针对多个字符串进行检查时,您可能希望使用case "${filename}" in ... esac
。
如果您的文件没有换行符,则可以find
使用xargs
。
# First test it
find . -type f \( ! -name process.sh -a ! -name file.txt \) 2>/dev/null |
head -10 | xargs -I % sh -c 'echo "File %"; echo "rm -f %"'
# Looking nice?
find . -type f \( ! -name process.sh -a ! -name file.txt \) 2>/dev/null |
head -1000 | xargs -I % sh -c 'cat "%" > file.txt; rm -f "%"'