2017-05-29 116 views
0

这是问题。我有一个Ubuntu 14.04服务器上有超过100,000K文件的目录。我需要在后台处理这些文件,因此我编写了一个shell脚本,将这些文件转换为较大的文件,然后删除该文件。然而,这个问题的起因在于它也是处理脚本和输出文件的猫。有任何想法吗?将文件名与字符串中的文件名进行比较的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

您处理完成后,您可以删除有问题的行:'sed的-i.bak“/模式匹配/ d”/file.txt' –

+0

的问题是,正在处理的文件号码不固定。总是有批量添加的文件。我的意思是有时候有10万甚至更少。我想我可以首先得到一些文件,从循环中得到-1,因为其他文件都有数字名称。不知道,我需要刷一下我对shell脚本的了解。 –

+0

除非我错过了某些东西,'ls | head -n 1'将始终返回第一个文件。我没有看到这个脚本通过文件进行。也不应该把'filename = $('ls | head -n 1')这行''filename = $(ls | head -n 1)'?当做简单的数学运算时,我更喜欢格式'c = $((c + 1))'。 – Deathgrip

回答

0

您应该在每个循环中只拨打ls | head -n 1一次。检查之后,再次调用ls | head -n 1,结果可能会不同(并发process.sh仍在运行或新文件)。
你想如何获得file.txt之后列出的文件?你正在打破循环,其他文件将被跳过。不要继续改变这一点,因为你会继续分配file.txtfilename
总是使用双引号为你的瓦尔(想想my file.txt),你可能也想习惯大括号。

假设你的批处理工作正常,并且它处理了最后一个非特殊文件。 "${filename}"将是空的!因此,从测试if [ -f "${filename}" ]开始,这将解决目录中的问题。

我真的希望你有权删除这些文件,所以你不会被卡住处理相同的文件1000次。

你不应该处理ls输出,所以替代

ls | egrep -v "file.txt|process.sh" | head -n 1 

只是用不同的方式做是错误的。

当您得到一个"${filename}"并且想根据多个字符串检查这个时,可能需要使用case "${filename}" in ... esac

当文件没有换行符时,可以使用findxargs

# 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 "%"' 
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 
相关问题