在循环中将文件名与字符串进行比较时出现Shell脚本问题

在循环中将文件名与字符串进行比较时出现Shell脚本问题,shell,ubuntu,sh,cat,rm,Shell,Ubuntu,Sh,Cat,Rm,问题就在这里。我在Ubuntu 14.04服务器上有一个目录,里面有超过100000个文件。我需要在后台处理这些文件,所以我编写了一个shell脚本,将这些文件转换成一个更大的文件,然后删除该文件。然而,出现的问题是,进程脚本和输出文件之间也存在冲突。有什么想法吗 #!/bin/sh c=0 #loop through 1000 results at 1 time d=1000 while [ $c -lt $d ] do filename=$(`ls | head

问题就在这里。我在Ubuntu 14.04服务器上有一个目录,里面有超过100000个文件。我需要在后台处理这些文件,所以我编写了一个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

我会重写剧本

#!/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

您应该在每个循环中只调用一次
ls | head-n1
。检查后,再次调用
ls | head-n 1
,结果可能不同(concurrent process.sh仍在运行或新文件)。
您想如何获取
file.txt
之后列出的文件?您正在跳出循环,其他文件将被跳过。不要在“继续”中更改此选项,因为您将继续将
file.txt
分配给
filename

始终对变量使用双引号(想想
my file.txt
),您可能还想习惯大括号

假设您的批处理工作正常,并且已处理最后一个非特殊文件<代码>“${filename}”将为空!因此,从测试
if[-f“${filename}”]
开始,这也将解决目录的问题

我真的希望你有删除这些文件的权限,这样你就不会在处理同一个文件时被卡住1000次

您不应该处理
ls
输出,因此

ls | egrep -v "file.txt|process.sh" | head -n 1
这只是另一种做错的方式

当您得到一个
“${filename}”
并希望对照多个字符串进行检查时,您可能希望在。。。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 "%"'

处理完成后,您可以删除有问题的行:
sed-i.bak'/pattern to match/d./file.txt
问题是正在处理的文件的编号不固定。始终存在批量添加的文件。我的意思是有时有10万人,有时更少。我想我可以先从循环中得到文件数,然后得到-1,因为其他文件都有数字名称。不确定,我想我需要学习一下shell脚本的知识。除非我遗漏了什么,
ls | head-n1
将始终返回第一个文件。我看不到此脚本在文件中运行。行
filename=$(
ls | head-n1
不应该是
filename=$(ls | head-n1)
?在做简单的数学时,我更喜欢
c=$((c+1))
。在循环中根本不要调用
ls
。如果您想处理前1000个文件(并且您想解析
ls
),只需在读取文件名时执行类似于
ls | sed 1000q |的操作;执行…
另外,将脚本和输出文件放在不同的目录中。