在循环中将文件名与字符串进行比较时出现Shell脚本问题
问题就在这里。我在Ubuntu 14.04服务器上有一个目录,里面有超过100000个文件。我需要在后台处理这些文件,所以我编写了一个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
#!/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 |的操作;执行…
另外,将脚本和输出文件放在不同的目录中。