Shell脚本问题,将文件名与循环中的字符串进行比较

时间:2017-05-29 17:32:34

标签: shell ubuntu sh cat rm

这是问题所在。我在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

2 个答案:

答案 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 "%"'