如何使用Bash在文件夹中获取.png文件数组

时间:2010-06-22 18:01:19

标签: linux bash

您好我是bash编程的新手,需要一些帮助。我正在构建一个用于图像处理的管道。我希望能够将png图像放在一个文件夹中并将它们传递给clusterImage.pl一旦完成我想将输出的文件传递给seperateObjects.pl,输出的文件具有相同的名称但具有kmeansOutput。 all.matrix附在最后。以下是我到目前为止所做的,但它不起作用。 任何帮助将不胜感激。谢谢

#!/bin/bash
#This script will take in an image and a matrix file.
#The output will be an image and a matrix file.

list=`ls *.png`
for i in $list
do
$file="./$list"
$image_array = $list
echo $file
#Cheching to see if the file exists.
for((j=0;j<=i;j++))
do
if [ -e image_array[j] ]; then
echo $file
echo "Begining processing"
#Take in an image and create a matrix from it.
perl clusterImage.pl SampleImage.png
#Take in a matrix and draw a picture showing the centers of all
#of the colonies.
perl seperateObjects.pl SampleImage.png.kmeansOutput.all.matrix
echo "Ending processing"
else
echo "There is an issue"
fi
done
done

4 个答案:

答案 0 :(得分:7)

这应该有效:

for file in *.png; do
    # do stuff with your file:
    perl clusterImage.pl "$file";
    # …
done

答案 1 :(得分:4)

我发现您的代码存在一些问题(或潜在的改进):

  1. 你不需要循环for i in $list,因为你从不在脚本中使用$i - 导致一遍又一遍地做同样的事情(与数量相同的次数)目录中的.png个文件)
  2. 您不需要使用Bash数组,因为Bash可以迭代*.png等列表中的不同文件名。
  3. 我怀疑你的意思是在目录中的每个perl clusterImage.pl文件上运行.png ...或者你呢?这很难说。编辑您的问题以更清楚地解释您的意思,我可以相应地编辑我的答案。
  4. 您可以使用短路来代替if语句,而不是[ -f file.png ] && echo "file exists"语句:if [ -f file.png ]; then echo "file exists" fi 短于

    perl clusterImage.pl <name_of_image.png>
  5. 如果我理解你要做的事情(而且我不确定),我认为这对你有用。对于目录中的每个图像,这将运行perl separateObjects.pl <name_of_image.png>.kmeansOutput.all.matrixfor image in *.png do [[ -f $image ]] && perl clusterImage.pl $image && perl separateObjects.pl $image.kmeansOutput.all.matrix done

    {{1}}

答案 2 :(得分:1)

如果你真的想要一个数组,可以:Advanced Bash-Scripting Guide: Arrays

但也许更好(或至少更简单)修改Perl脚本来处理文件列表,或者单独处理每个图像。

答案 3 :(得分:1)

您通常不希望在作业的左侧有变量名称上的美元符号。

可以创建一个这样的数组:image_array=($(ls *.png))但如果文件名中包含空格则会失败。

但是,

Don't parse ls至少是出于这个原因。

Don't use backticks,请改用$()

您已经嵌套了似乎彼此冲突的循环。 knittl's answer中的结构是您应该使用的结构。